Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add options for mounting SCSI or NVMe local SSD though Block or Filesystem and do all of that with UUID #53466

Merged
merged 1 commit into from
Nov 16, 2017

Conversation

davidz627
Copy link
Contributor

@davidz627 davidz627 commented Oct 4, 2017

Fixes: #51431

Mount SCSI local SSD by UUID in /mnt/disks/by-uuid/, also allows for users to request and mount NVMe disks. Both types of disks will be accessable either through block or filesystem

To see code in progress for NVMe and block support see working branch: https://github.com/davidz627/kubernetes/tree/localExt

@k8s-ci-robot k8s-ci-robot added do-not-merge/release-note-label-needed Indicates that a PR should not merge because it's missing one of the release note labels. size/L Denotes a PR that changes 100-499 lines, ignoring generated files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. labels Oct 4, 2017
@davidz627
Copy link
Contributor Author

cc @msau42

@msau42
Copy link
Member

msau42 commented Oct 4, 2017

/ok-to-test

@k8s-ci-robot k8s-ci-robot removed the needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. label Oct 4, 2017
@msau42
Copy link
Member

msau42 commented Oct 4, 2017

/release-note-none

@k8s-ci-robot k8s-ci-robot added release-note-none Denotes a PR that doesn't merit a release note. and removed do-not-merge/release-note-label-needed Indicates that a PR should not merge because it's missing one of the release note labels. labels Oct 4, 2017
@@ -679,6 +679,8 @@ PROMETHEUS_TO_SD_ENDPOINT: $(yaml-quote ${PROMETHEUS_TO_SD_ENDPOINT:-})
PROMETHEUS_TO_SD_PREFIX: $(yaml-quote ${PROMETHEUS_TO_SD_PREFIX:-})
ENABLE_PROMETHEUS_TO_SD: $(yaml-quote ${ENABLE_PROMETHEUS_TO_SD:-false})
ENABLE_POD_PRIORITY: $(yaml-quote ${ENABLE_POD_PRIORITY:-})
NODE_LOCAL_SSDS: $(yaml-quote ${NODE_LOCAL_SSDS:-0})
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm is this the right place to add this? This is a GCE specific variable, but the file is not GCE specific

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not actually sure. I can't find any other scripts that seem to set env variables on the node, this looks like the only one to me. Could you point me to an alternative or something else I should be looking for?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh I think I see now. Before, the configure-vm script didn't need NODE_LOCAL_SSDS, but now it does. Yes, this is the right place to copy over env vars

@@ -36,6 +36,7 @@ MASTER_ROOT_DISK_SIZE=${MASTER_ROOT_DISK_SIZE:-$(get-master-root-disk-size)}
NODE_DISK_TYPE=${NODE_DISK_TYPE:-pd-standard}
NODE_DISK_SIZE=${NODE_DISK_SIZE:-100GB}
NODE_LOCAL_SSDS=${NODE_LOCAL_SSDS:-0}
NODE_LOCAL_SSDS_EXT=${NODE_LOCAL_SSDS_EXT:-""}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add comments to describe what the variable means, and the format of the values

chmod +w ${ssdmap}
fi

# each line looks like "${device} persistant-uuid"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

persistent

# Get the real UUID of the device
item=$(readlink -f ${device} | cut -d '/' -f 3)
myuuid=$(ls -l /dev/disk/by-uuid/ | grep ${item} | tr -s ' ' | cut -d ' ' -f 9)
mountpoint="/mnt/disks/by-uuid/google-local-ssds-${interface,,}-fs/local-ssd-${myuuid}"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you make this path a constant since we use it a few times in this file

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do you mean just make "/mnt/disks/by-uuid/google-local-ssds" a const var like mntprefix or something?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes

mkdir -p "${mountpoint}"
echo "Mounting '${device}' at '${mountpoint}'"
mount -o discard,defaults "${device}" "${mountpoint}"
chmod a+w ${mountpoint}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to do this considering that it wasn't done previously?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe this was done previously on a mount:

chmod a+w ${ssdmount}

format=$3

if [[ ${format,,} == "fs" ]]; then
safe-format-and-mount-by-interface ${ssd} ${interface,,}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What if we call safe-format-and-mount like before, and then a new function that does the bind mount to the uuid path?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this method is more natural for if we plan to eventually deprecate the "old" mount points. We would just have to delete the bind-mounting section as opposed to reversing the logic when the backwards compatibility is removed.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we'll be able to deprecate it anytime soon. We'll have to support both types of users. Those that want to use hostpath and needs the paths to be consistent across nodes, and those that want Local PVs which needs all the paths to be unique.

@davidz627
Copy link
Contributor Author

/retest

@@ -679,6 +679,8 @@ PROMETHEUS_TO_SD_ENDPOINT: $(yaml-quote ${PROMETHEUS_TO_SD_ENDPOINT:-})
PROMETHEUS_TO_SD_PREFIX: $(yaml-quote ${PROMETHEUS_TO_SD_PREFIX:-})
ENABLE_PROMETHEUS_TO_SD: $(yaml-quote ${ENABLE_PROMETHEUS_TO_SD:-false})
ENABLE_POD_PRIORITY: $(yaml-quote ${ENABLE_POD_PRIORITY:-})
NODE_LOCAL_SSDS: $(yaml-quote ${NODE_LOCAL_SSDS:-0})
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh I think I see now. Before, the configure-vm script didn't need NODE_LOCAL_SSDS, but now it does. Yes, this is the right place to copy over env vars

format=$2

total=0
if [[ ! -z ${NODE_LOCAL_SSDS_EXT} ]]; then
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a comment describe the format of the value?

# Get the real UUID of the device
item=$(readlink -f ${device} | cut -d '/' -f 3)
myuuid=$(ls -l /dev/disk/by-uuid/ | grep ${item} | tr -s ' ' | cut -d ' ' -f 9)
mountpoint="/mnt/disks/by-uuid/google-local-ssds-${interface,,}-fs/local-ssd-${myuuid}"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes

@msau42
Copy link
Member

msau42 commented Oct 5, 2017

/assign

@davidz627
Copy link
Contributor Author

addressed comments and added tests.

@@ -91,7 +93,7 @@ function get-local-disk-num() {
function safe-block-symlink(){
device=$1
interface=$2
mkdir -p "/mnt/disks/by-uuid/google-local-ssds-${interface,,}-block"
mkdir -p "${UUID_MNT_PREFIX}-${interface,,}-block"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you handle lowercasing $interface when we're parsing the args?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i mean very technically none of these ever need to be lower cased because they just come from some hardcoded "scsi" "fs" strings. I'll remove them all.

@@ -54,6 +55,8 @@ const (
DirectoryLocalVolumeType LocalVolumeType = "dir"
// creates a tmpfs and mounts it
TmpfsLocalVolumeType LocalVolumeType = "tmpfs"
// tests based on local ssd at /mnt/disks/by-uuid/
GCELocalSSDVolumeType LocalVolumeType = "gcessd"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe call it "gce-localssd-scsi-fs"


Context("when two pods mount a local volume at the same time", func() {
BeforeEach(func() {
framework.SkipUnlessLocalSSDExists("scsi", "fs", config.node0)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We only want to skip if the type == GCELocalSSDVolumeType.

Ditto everywhere else

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In that case if we want to keep the tests as they are they will not "skip" the test perse, just skip the part that involves localSSD. The test will still show up as "passed" when running because it just wont do the localSSD part.

Alternatively I could split out the tests so that it does localSSD seperately and actually "skips" the test so it is more clear as to what is happening when you run them.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmm I wonder if it's possible to restructure the tests so that there is an It() for each type.

testDirName := "local-volume-test-" + string(uuid.NewUUID())
hostDir := filepath.Join(hostBase, testDirName)
var hostDir string
if localVolumeType == GCELocalSSDVolumeType {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the setup and cleanup methods can be abstracted out into an interface for each supported LocalVolumeType

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Im not sure what you mean by abstracting them out into an interface. Do you mean to have multiple methods for setup and cleanup (one for each volume type)?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I mean define an interface with Setup and Teardown methods. And have each volume type implement that interface with their own methods.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm actually not really sure how to do that since localVolumeType aren't actually different "types" but are actually just strings so you can't really distinguish them for interface methods. They are all of type "LocalVolumeType". Any documentation on what you're suggesting here?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could have a map with key = local volume type string, value = setup and teardown methods

fi

sym="${UUID_MNT_PREFIX}-${interface,,}-block/local-ssd-${myuuid}"
# dont make the exact directory first or else symlink goes 1 directory down
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you explain this comment? i'm not understanding it

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you make the directory with "mkdir" before doing a symlink to that directory, it actually symlinks to "inside" the directory instead of "to" the directory. I've updated the comment to:

Do not "mkdir -p ${sym}" as that will cause unintended symlink behavior

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok yeah that's correct. Symlinks are files, not directories.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that explains a lot

@@ -140,6 +241,8 @@ function find-master-pd {
MASTER_PD_DEVICE="/dev/disk/by-id/${relative_path}"
}


Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove

for ssdgroup in "${ssdgroups[@]}"
do
IFS="," read -r -a ssdopts <<< ${ssdgroup}
for i in $(seq ${ssdopts[0]}); do
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if the user misformats these variables? (like maybe only includes 1 out of the 3 values)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it just kinda "goes with it" and tries its best, an invalid array access here will basically just return the empty string. Should I add some validation?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think some validation would be good, so that we don't accidentally create more local SSDs than the user intended. Actually, there was a bug a few months ago where "seq 0" returns "1 0" on mac, so it actually created 2 local SSDs instead of 0. We should make sure we don't hit the same issue here.

I guess if the local ssd interface is malformed, then the instance creation should fail with invalid argument.

@@ -66,8 +68,57 @@ function create-dirs {
fi
}

# Formats the given device ($1) if needed and mounts it at given mount point
# ($2).
function get-local-disk-num() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a comment as to what this function does

function ensure-local-ssds() {
get-local-disk-num "scsi" "fs"
scsifsnum=${total}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can combine these two lines

function ensure-local-ssds() {
get-local-disk-num "scsi" "fs"
scsifsnum=${total}
scsifsnum=$((scsifsnum+NODE_LOCAL_SSDS))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is going to break GKE because GKE doesn't set NODE_LOCAL_SSDS, so scsifsnum will be 0.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do they still provision localssds without setting that env var?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, GKE creates the instances differently than the cluster/gce/util.sh script.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We may need to do something like:

  1. First setup all the block devices
  2. The remainder is for filesystem

# Formats the given device ($1) if needed and mounts it at given mount point
# ($2).
function get-local-disk-num() {
interface=$1
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you prefix all local variables with "local"

@davidz627
Copy link
Contributor Author

addressed all comments.

local interface=$1
local format=$2

total=0
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you give this a more distinct name to minimize variable name collisions

fi

# each line looks like "${device} persistent-uuid"
if [[ ! -z $(cat ${ssdmap} | grep ${device}) ]]; then
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could just do grep $device $ssdmap.

I would add a space after device, the handle the case where you have 2 devices and the first is a substring of the second.

udevadm settle

# Get the real UUID of the device
local item=$(readlink -f ${device} | cut -d '/' -f 3)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a comment at each step what the expected output format is?

if [[ ${format} == "fs" ]]; then
if [[ ${interface} == "scsi" ]]; then
local scsinum=`echo ${ssd} | sed -e 's/\/dev\/disk\/by-id\/google-local-ssd-\([0-9]*\)/\1/'`
local mountpoint="/mnt/disks/ssd${scsinum}"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is only going to be local to this if block?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think local restricts only to function blocks. So this is technically valid. Would it look better in some other way?

I dont know if bash has the concept of variable declaration without initialization so i couldn't do:

local scsinum;

at some earlier point.

function ensure-local-ssds() {
get-local-disk-num "scsi" "block"
local scsiblocknum=${total}
local i=0
for ssd in /dev/disk/by-id/google-local-ssd-*; do
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we sort this list to ensure that we process the disks in the same order?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The ${ssd} will already be sorted by default. I do remember why i decided to do "fs" disks first now though, now the disk numbers will make even less sense because they would start with the numbers after block storage.

Ex. We have 2 block and 2 fs devices
google-local-ssd-[0,1] are block,
then when we mount the fs devices we will have them mounted at:
/mnt/disks/ssd2 /mnt/disks/ssd3

And if we include nvme devices in the mix they might not even be increasing by 1 each time...

Can be solved by re-indexing them to start at 0 and monotonically increment. But then the numbers are no longer 1-1 from /dev/disks to /mnt/disks

@davidz627 davidz627 changed the title Mount SCSI local SSD by UUID in /mnt/disks/by-uuid/ Add options for mounting SCSI or NVMe local SSD though Block or Filesystem Oct 9, 2017
@davidz627
Copy link
Contributor Author

all comments addressed and nvme support added

@davidz627
Copy link
Contributor Author

Comments from other PR addressed.

@davidz627
Copy link
Contributor Author

/retest

@davidz627 davidz627 changed the title Add options for mounting SCSI or NVMe local SSD though Block or Filesystem Add options for mounting SCSI or NVMe local SSD though Block or Filesystem and do all of that with UUID Oct 13, 2017
@zmerlynn
Copy link
Member

LGTM except a couple of real comments and some nits.

…disks/by-uuid/, set up ability to have unformatted disk symlinked in /dev/disk/by-uuid/. Added tests. Preserved backwards compatibility.
@davidz627
Copy link
Contributor Author

davidz627 commented Nov 15, 2017

addressed your comments @zmerlynn

@k8s-github-robot k8s-github-robot removed the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Nov 15, 2017
@davidz627
Copy link
Contributor Author

/retest

1 similar comment
@davidz627
Copy link
Contributor Author

/retest

@zmerlynn
Copy link
Member

zmerlynn commented Nov 16, 2017 via email

@k8s-ci-robot k8s-ci-robot added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Nov 16, 2017
@k8s-github-robot
Copy link

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: davidz627, msau42, zmerlynn

Associated issue: 51431

The full list of commands accepted by this bot can be found here.

Needs approval from an approver in each of these OWNERS Files:

You can indicate your approval by writing /approve in a comment
You can cancel your approval by writing /approve cancel in a comment

@k8s-github-robot k8s-github-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Nov 16, 2017
@k8s-github-robot
Copy link

/test all [submit-queue is verifying that this PR is safe to merge]

@k8s-github-robot
Copy link

Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions here.

@mikedanese
Copy link
Member

I'm running gke-gci on the revert. #55889

@msau42
Copy link
Member

msau42 commented Nov 16, 2017

I'm curious why this is affecting gke and not gce.

# Format of this variable will be "#,scsi/nvme,block/fs" you can specify multiple
# configurations by seperating them by a semi-colon ex. "2,scsi,fs;1,nvme,block"
# is a request for 2 SCSI formatted and mounted SSDs and 1 NVMe block device SSD.
NODE_LOCAL_SSDS_EXT=${NODE_LOCAL_SSDS_EXT:-""}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if it's because on gce it's defaulted to "", but on GKE it's unset.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I found this error in the master logs:

/home/kubernetes/bin/configure-helper.sh: line 98: NODE_LOCAL_SSDS_EXT: unbound variable

We keep running into this every time a new var is added, because GKE does not use config-default.sh at all, and configure-helper.sh uses nounset.

Copy link
Contributor Author

@davidz627 davidz627 Nov 16, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@enisoc how has this been fixed in the past? I was just going to add a 'NODE_LOCAL_SSDS_EXT=${NODE_LOCAL_SSDS_EXT:-""}' to configure-helper.sh but it feels like maybe there might be a better solution

k8s-github-robot pushed a commit that referenced this pull request Nov 16, 2017
Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

Revert "Add options for mounting SCSI or NVMe local SSD though Block or Filesystem and do all of that with UUID"

Reverts #53466

@mindprince @davidz627
local format="${2}"

localdisknum=0
if [[ ! -z "${NODE_LOCAL_SSDS_EXT}" ]]; then
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add a :- to this, e.g. "${NODE_LOCAL_SSDS_EXT:-}"

safe-format-and-mount "${ssd}" "${mountpoint}"
# We only do the bindmount if users are using the new local ssd request method
# see https://github.com/kubernetes/kubernetes/pull/53466#discussion_r146431894
if [[ ! -z "${NODE_LOCAL_SSDS_EXT}" ]]; then
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:- here as well

@@ -37,6 +39,11 @@ else
exit 1
fi

if [[ ${NODE_LOCAL_SSDS} -ge 1 ]] && [[ ! -z ${NODE_LOCAL_SSDS_EXT} ]] ; then
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:- here as well

@@ -587,6 +617,19 @@ function create-node-template() {
fi

local local_ssds=""
local_ssd_ext_count=0
if [[ ! -z ${NODE_LOCAL_SSDS_EXT-""} ]]; then
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

instead of -"", use :-

k8s-github-robot pushed a commit that referenced this pull request Nov 21, 2017
Automatic merge from submit-queue (batch tested with PRs 54824, 55911, 55730, 55979, 55961). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

Add options for mounting SCSI or NVMe local SSD though Block or Filesystem and do all of that with UUID

Fixes: #51431
Fixed version of: #53466

Mount SCSI local SSD by UUID in /mnt/disks/by-uuid/, also allows for users to request and mount NVMe disks. Both types of disks will be accessible either through block or file-system.

I have confirmed that it is no longer crashing when nodes are initialized on GKE.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approved Indicates a PR has been approved by an approver from all required OWNERS files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. lgtm "Looks good to me", indicates that a PR is ready to be merged. release-note-none Denotes a PR that doesn't merit a release note. size/XL Denotes a PR that changes 500-999 lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.