| filename | sha512 hash |
|---|---|
| kubernetes.tar.gz | 99aa74225dd999d112ebc3e7b7d586a2312ec9c99de7a7fef8bbbfb198a5b4cf740baa57ea262995303e2a5060d26397775d928a086acd926042a41ef00f200b |
| kubernetes-src.tar.gz | 0be7d1d6564385cc20ff4d26bab55b71cc8657cf795429d04caa5db133a6725108d6a116553bf55081ccd854a4078e84d26366022634cdbfffd1a34a10b566cf |
| filename | sha512 hash |
|---|---|
| kubernetes-client-darwin-386.tar.gz | a5fb80d26c2a75741ad0efccdacd5d5869fbc303ae4bb1920a6883ebd93a6b41969f898d177f2602faf23a7462867e1235edeb0ba0675041d0c8d5ab266ec62d |
| kubernetes-client-darwin-amd64.tar.gz | 47a9a78fada4b840d9ae4dac2b469a36d0812ac83d22fd798c4cb0f1673fb65c6558383c19a7268ed7101ac9fa32d53d79498407bdf94923f4f8f019ea39e912 |
| kubernetes-client-linux-386.tar.gz | 916e4dd98f5ed8ee111eeb6c2cf5c5f313e1d98f3531b40a5a777240ddb96b9cc53df101daa077ffff52cf01167fdcc39d38a8655631bac846641308634e127a |
| kubernetes-client-linux-amd64.tar.gz | fccf152588edbaaa21ca94c67408b8754f8bc55e49470380e10cf987be27495a8411d019d807df2b2c1c7620f8535e8f237848c3c1ac3791b91da8df59dea5aa |
| kubernetes-client-linux-arm.tar.gz | 066c55fabbe3434604c46574c51c324336a02a5bfaed2e4d83b67012d26bf98354928c9c12758b53ece16b8567e2b5ce6cb88d5cf3008c7baf3c5df02611a610 |
| kubernetes-client-linux-arm64.tar.gz | e41be74cc36240a64ecc962a066988b5ef7c3f3112977efd4e307b35dd78688f41d6c5b376a6d1152d843182bbbe75d179de75675548bb846f8c1e28827e0e0c |
| kubernetes-client-linux-ppc64le.tar.gz | 08783eb3bb2e35b48dab3481e17d6e345d43bab8b8dee25bb5ff184ba46cb632750d4c38e9982366050aecce6e121c67bb6812dbfd607216acd3a2d19e05f5a1 |
| kubernetes-client-linux-s390x.tar.gz | bcb6eb9cd3d8c92dfaf4f102ff2dc7517f632b1e955be6a02e7f223b15fc09c4ca2d6d9cd5b23871168cf6b455e2368daf17025c9cd61bf43d2ea72676db913a |
| kubernetes-client-windows-386.tar.gz | efbc764d8e2889ce13c9eaaa61f685a8714563ddc20464523140d6f5bef0dfd51b745c3bd3fe2093258db242bf9b3207f8e9f451b0484de64f18cdb7162ec30e |
| kubernetes-client-windows-amd64.tar.gz | b34bce694c6a0e4c8c5ddabcecb6adcb4d35f8c126b4b5ced7e44ef39cd45982dd9f6483a38e04430846f4da592dc74b475c37da7fe08444ef4eb5efde85e0b2 |
| filename | sha512 hash |
|---|---|
| kubernetes-server-linux-amd64.tar.gz | a6bdac1eba1b87dc98b2bf5bf3690758960ecb50ed067736459b757fca0c3b01dd01fd215b4c06a653964048c6a81ea80b61ee8c7e4c98241409c091faf0cee1 |
| kubernetes-server-linux-arm.tar.gz | 0560e1e893fe175d74465065d43081ee7f40ba7e7d7cafa53e5d7491f89c61957cf0d3abfa4620cd0f33b6e44911b43184199761005d20b72e3cd2ddc1224f9f |
| kubernetes-server-linux-arm64.tar.gz | 4d5dd001fa3ac2b28bfee64e85dbedab0706302ffd634c34330617674e7a90e0108710f4248a2145676bd72f0bbc3598ed61e1e739c64147ea00d3b6a4ba4604 |
| kubernetes-server-linux-ppc64le.tar.gz | cc642fca57e22bf6edd371e61e254b369b760c67fa00cac50e34464470f7eea624953deff800fa1e4f7791fe06791c48dbba3ed47e789297ead889c2aa7b2bbf |
| kubernetes-server-linux-s390x.tar.gz | 1f480ba6f593a3aa20203e82e9e34ac206e35839fd9135f495c5d154480c57d1118673dcb5a6b112c18025fb4a847f65dc7aac470f01d2f06ad3da6aa63d98a3 |
| filename | sha512 hash |
|---|---|
| kubernetes-node-linux-amd64.tar.gz | e987f141bc0a248e99a371ce220403b78678c739a39dad1c1612e63a0bee4525fbca5ee8c2b5e5332a553cc5f63bce9ec95645589298f41fe83e1fd41faa538e |
| kubernetes-node-linux-arm.tar.gz | 8b084c1063beda2dd4000e8004634d82e580f05cc300c2ee13ad84bb884987b2c7fd1f033fb2ed46941dfc311249acef06efe5044fb72dc4b6089c66388e1f61 |
| kubernetes-node-linux-arm64.tar.gz | 365bdf9759e24d22cf507a0a5a507895ed44723496985e6d8f0bd10b03ffe7c78198732ee39873912147f2dd840d2e284118fc6fc1e3876d8f4c2c3a441def0b |
| kubernetes-node-linux-ppc64le.tar.gz | ff54d83dd0fd3c447cdd76cdffd253598f6800045d2b6b91b513849d15b0b602590002e7fe2a55dc25ed5a05787f4973c480126491d24be7c5fce6ce98d0b6b6 |
| kubernetes-node-linux-s390x.tar.gz | 527cd9bf4bf392c3f097f232264c0f0e096ac410b5211b0f308c9d964f86900f5875012353b0b787efc9104f51ad90880f118efb1da54eba5c7675c1840eae5f |
| kubernetes-node-windows-amd64.tar.gz | 4f76a94c70481dd1d57941f156f395df008835b5d1cc17708945e8f560234dbd426f3cff7586f10fd4c24e14e3dfdce28e90c8ec213c23d6ed726aec94e9b0ff |
A complete changelog for the release notes is now hosted in a customizable format at relnotes.k8s.io. Check it out and please give us your feedback!
We’re pleased to announce the delivery of Kubernetes 1.16, our third release of 2019! Kubernetes 1.16 consists of 31 enhancements: 8 enhancements moving to stable, 8 enhancements in beta, and 15 enhancements in alpha.
The main themes of this release are:
livez and readyz endpoints. This will be fixed in 1.16.1.iptables 1.8.0 or newer should start it in legacy mode. Please note that this affects all versions of Kubernetes and not only v1.16.0. For more detailed information about the issue and how to apply a workaround, please refer to the official documentationamd64 will now contain the architecture in the RepoTags manifest.json section. If you are using docker manifests there are not visible changes. (#80266, @javier-b-perez)beta.kubernetes.io/metadata-proxy-ready, beta.kubernetes.io/metadata-proxy-ready and beta.kubernetes.io/kube-proxy-ds-ready are no longer added on new nodes.node.kubernetes.io/masq-agent-ds-ready instead of beta.kubernetes.io/masq-agent-ds-ready as its node selector.node.kubernetes.io/kube-proxy-ds-ready instead of beta.kubernetes.io/kube-proxy-ds-ready as its node selector.cloud.google.com/metadata-proxy-ready instead of beta.kubernetes.io/metadata-proxy-ready as its node selector.API
The following APIs are no longer served by default:
All resources under apps/v1beta1 and apps/v1beta2 - use apps/v1 instead
daemonsets, deployments, replicasets resources under extensions/v1beta1 - use apps/v1 instead
networkpolicies resources under extensions/v1beta1 - use networking.k8s.io/v1 instead
podsecuritypolicies resources under extensions/v1beta1 - use policy/v1beta1 instead
Serving these resources can be temporarily re-enabled using the --runtime-config apiserver flag.
apps/v1beta1=trueapps/v1beta2=trueextensions/v1beta1/daemonsets=true,extensions/v1beta1/deployments=true,extensions/v1beta1/replicasets=true,extensions/v1beta1/networkpolicies=true,extensions/v1beta1/podsecuritypolicies=trueThe ability to serve these resources will be completely removed in v1.18. (#70672, @liggitt)
extensions/v1beta1 in v1.20. Migrate use to the networking.k8s.io/v1beta1 API, available since v1.14. Existing persisted data can be retrieved via the networking.k8s.io/v1beta1 API.scheduling.k8s.io/v1beta1 and scheduling.k8s.io/v1alpha1 in v1.17. Migrate to the scheduling.k8s.io/v1 API, available since v1.14. Existing persisted data can be retrieved via the scheduling.k8s.io/v1 API.export query parameter for list API calls, deprecated since v1.14, will be removed in v1.18.series.state field in the events.k8s.io/v1beta1 Event API is deprecated and will be removed in v1.18 (#75987, @yastij)apiextensions.k8s.io/v1beta1 version of CustomResourceDefinition is deprecated and will no longer be served in v1.19. Use apiextensions.k8s.io/v1 instead. (#79604, @liggitt)admissionregistration.k8s.io/v1beta1 versions of MutatingWebhookConfiguration and ValidatingWebhookConfiguration are deprecated and will no longer be served in v1.19. Use admissionregistration.k8s.io/v1 instead. (#79549, @liggitt)metadata.initializers field, deprecated in 1.13, has been removed. (#79504, @yue9944882)OutOfDisk has been removed. Use the DiskPressure condition instead. (#72420, @Pingan2017)metadata.selfLink field is deprecated in individual and list objects. It will no longer be returned starting in v1.20, and the field will be removed entirely in v1.21. (#80978, @wojtek-t)ovirt, cloudstack and photon have been removed (#72178, @dims)Cinder and ScaleIO volume providers have been deprecated and will be removed in a future release. (#80099, @dims)PodPriority feature gate is now on by default and cannot be disabled. The feature gate will be removed in v1.18. (#79262, @draveness)EnableAggregatedDiscoveryTimeout=false to temporarily revert behavior to the previous 30 second timeout if required (the temporary EnableAggregatedDiscoveryTimeout feature gate will be removed in v1.17). (#82146, @deads2k)scheduler.alpha.kubernetes.io/critical-pod annotation is removed. Pod priority (spec.priorityClassName) should be used instead to mark pods as critical. (#80342, @draveness)Features:
GCERegionalPersistentDisk (since 1.15.0)CustomResourcePublishOpenAPICustomResourceSubresourcesCustomResourceValidationCustomResourceWebhookConversionHugePages, VolumeScheduling, CustomPodDNS and PodReadinessGates have been removed (#79307, @draveness)hyperkube
--make-symlinks flag, deprecated in v1.14, has been removed. (#80017, @Pothulapati)kube-apiserver
--basic-auth-file flag and authentication mode is deprecated and will be removed in a future release. It is not recommended for production environments. (#81152, @tedyu)--cloud-provider-gce-lb-src-cidrs flag has been deprecated. This flag will be removed once the GCE Cloud Provider is removed from kube-apiserver. (#81094, @andrewsykim)--enable-logs-handler flag and log-serving functionality is deprecated since v1.15, and scheduled to be removed in v1.19. (#77611, @rohitsardesai83)10.0.0.0/24 which will be removed in 6 months/2 releases. Cluster admins must specify their own desired value, by using --service-cluster-ip-range on kube-apiserver. (#81668, @darshanime)kube-proxy
kube-scheduler
kubeadm
ready plugin.proxy plugin has been deprecated. The forward plugin is to be used instead.kubernetes plugin removes the resyncperiod option.upstream option is deprecated and ignored if included. (#82127, @rajansandeep)kubectl
kubectl convert, deprecated since v1.14, will be removed in v1.17.--export flag for the kubectl get command, deprecated since v1.14, will be removed in v1.18.kubectl cp no longer supports copying symbolic links from containers; to support this use case, see kubectl exec --help for examples using tar directly (#82143, @soltysh)--include-uninitialized. (#80337, @draveness)kubelet
--containerized flag was deprecated in 1.14 and has been removed (#80043, @dims)beta.kubernetes.io/os and beta.kubernetes.io/arch labels, deprecated since v1.14, are targeted for removal in v1.18.kubernetes.io- or k8s.io-prefixed labels via --node-labels, other than the specifically allowed labels/prefixes. (#79305, @paivagustavo)client-go
DirectCodecFactory (replaced with serializer.WithoutConversionCodecFactory), DirectEncoder (replaced with runtime.WithVersionEncoder) and DirectDecoder (replaced with runtime.WithoutVersionDecoder). (#79263, @draveness)aggregator_openapi_v2_regeneration_count, aggregator_openapi_v2_regeneration_gaugeand apiextension_openapi_v2_regeneration_count counting the triggering APIService and CRDs and the reason (add, update, delete) when kube-apiserver regenerates the OpenAPI spec. (#81786, @sttts)authentication_attempts that can be used to understand the attempts of authentication. (#81509, @RainbowMango)apiserver_admission_webhook_rejection_count with details about the causing for a webhook rejection. (#81399, @roycaihw)container_sockets, container_threads, and container_threads_max metrics (#81972, @dashpole)container_state label to running_container_count kubelet metrics, to get count of containers based on their state(running/exited/created/unknown) (#81573, @irajdeep)apiserver_watch_events_total that can be used to understand the number of watch events in the system. (#78732, @mborsz)apiserver_watch_events_sizes that can be used to estimate sizes of watch events in the system. (#80477, @mborsz)sync_proxy_rules_iptables_restore_failures_total for kube-proxy iptables-restore failures (both ipvs and iptables modes) (#81210, @figo)kubelet_evictions metric that counts the number of pod evictions carried out by the kubelet to reclaim resources (#81377, @sjenning)pod_name and container_name to match instrumentation guidelines. Any Prometheus queries that match pod_name and container_name labels (e.g. cadvisor or kubelet probe metrics) must be updated to use pod and container instead. (#80376, @ehashman)rejected label in apiserver_admission_webhook_admission_duration_seconds metrices now properly indicates if the request was rejected. (#81399, @roycaihw)CustomResourceDefaulting feature is promoted to beta and enabled by default. Defaults may be specified in structural schemas via the apiextensions.k8s.io/v1 API. See https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#specifying-a-structural-schema for details. (#81872, @sttts)spec if a corresponding RuntimeClassName is specified. PodOverhead is an alpha feature as of Kubernetes 1.16. (#78484, @egernst)kubectl exec runs a process in an existing container. Also like kubectl exec, no resources are reserved for ephemeral containers and they are not restarted when they exit. Note that container namespace targeting is not yet implemented, so process namespace sharing must be enabled to view process from other containers in the pod. (#59484, @verb)--endpoint-updates-batch-period in kube-controller-manager can be used to reduce the number of endpoints updates generated by pod changes. (#80509, @mborsz)--all-namespaces flag is now honored by kubectl wait (#81468, @ashutoshgngwr)kubectl get -w now takes an --output-watch-events flag to indicate the event type (ADDED, MODIFIED, DELETED) (#72416, @liggitt)--shutdown-delay-duration to kube-apiserver in order to delay a graceful shutdown. /healthz will keep returning success during this time and requests are normally served, but /readyz will return failure immediately. This delay can be used to allow the SDN to update iptables on all nodes and stop sending traffic. (#74416, @sttts) Kubeadm now seamlessly migrates the CoreDNS Configuration when upgrading CoreDNS. (#78033, @rajansandeep)\livez for liveness health checking for kube-apiserver. Using the parameter --maximum-startup-sequence-duration will allow the liveness endpoint to defer boot-sequence failures for the specified duration period. (#81969, @logicalhan)IPv6DualStack=true in the ClusterConfiguration. Additionally, for each worker node, the user should set the feature-gate for kubelet using either nodeRegistration.kubeletExtraArgs or KUBELET_EXTRA_ARGS. (#80531, @Arvinderpal)--cluster-cidr="<cidr1>,<cidr2>". Notes:--(kube|system)-reserved-cgroup, with --cgroup-driver=systemd, it is now possible to use the fully qualified cgroupfs name (i.e. /test-cgroup.slice). (#78793, @mattjmcnaughton)MutatingWebhookConfiguration and ValidatingWebhookConfiguration APIs have been promoted to admissionregistration.k8s.io/v1:failurePolicy default changed from Ignore to Fail for v1matchPolicy default changed from Exact to Equivalent for v1timeout default changed from 30s to 10s for v1sideEffects default value is removed, and the field made required, and only None and NoneOnDryRun are permitted for v1admissionReviewVersions default value is removed and the field made required for v1 (supported versions for AdmissionReview are v1 and v1beta1)name field for specified webhooks must be unique for MutatingWebhookConfiguration and ValidatingWebhookConfiguration objects created via admissionregistration.k8s.io/v1AdmissionReview API sent to and received from admission webhooks has been promoted to admission.k8s.io/v1. Webhooks can specify a preference for receiving v1 AdmissionReview objects with admissionReviewVersions: ["v1","v1beta1"], and must respond with an API object in the same apiVersion they are sent. When webhooks use admission.k8s.io/v1, the following additional validation is performed on their responses:response.patch and response.patchType are not permitted from validating admission webhooksapiVersion: "admission.k8s.io/v1" is requiredkind: "AdmissionReview" is requiredresponse.uid: "<value of request.uid>" is requiredresponse.patchType: "JSONPatch" is required (if response.patch is set) (#80231, @liggitt)CustomResourceDefinition API type is promoted to apiextensions.k8s.io/v1 with the following changes:default feature in validation schemas is limited to v1spec.scope is no longer defaulted to Namespaced and must be explicitly specifiedspec.version is removed in v1; use spec.versions insteadspec.validation is removed in v1; use spec.versions[*].schema insteadspec.subresources is removed in v1; use spec.versions[*].subresources insteadspec.additionalPrinterColumns is removed in v1; use spec.versions[*].additionalPrinterColumnsinsteadspec.conversion.webhookClientConfig is moved to spec.conversion.webhook.clientConfig in v1spec.conversion.conversionReviewVersions is moved to spec.conversion.webhook.conversionReviewVersions in v1spec.versions[*].schema.openAPIV3Schema is now required when creating v1 CustomResourceDefinitionsspec.preserveUnknownFields: true is disallowed when creating v1 CustomResourceDefinitions; it must be specified within schema definitions as x-kubernetes-preserve-unknown-fields: trueadditionalPrinterColumns items, the JSONPath field was renamed to jsonPath in v1 (fixes https://github.com/kubernetes/kubernetes/issues/66531) The apiextensions.k8s.io/v1beta1 version of CustomResourceDefinition is deprecated and will no longer be served in v1.19. (#79604, @liggitt)ConversionReview API sent to and received from custom resource CustomResourceDefinition conversion webhooks has been promoted to apiextensions.k8s.io/v1. CustomResourceDefinition conversion webhooks can now indicate they support receiving and responding with ConversionReview API objects in the apiextensions.k8s.io/v1 version by including v1 in the conversionReviewVersions list in their CustomResourceDefinition. Conversion webhooks must respond with a ConversionReview object in the same apiVersion they receive. apiextensions.k8s.io/v1 ConversionReviewresponses must specify a response.uid that matches the request.uid of the object they were sent. (#81476, @liggitt)conditions in apiextensions.v1beta1.CustomResourceDefinitionStatus and apiextensions.v1.CustomResourceDefinitionStatus is now optional instead of required. (#64996, @roycaihw)lastTransitionTime is now updated. (#69655, @CaoShuFeng)GetReference() and GetPartialReference() function from pkg/api/ref, as the same function exists also in staging/src/k8s.io/client-go/tools/ref (#80361, @wojtek-t)metadata. (#78829, @sttts)/ with non-2xx HTTP responses (#79895, @deads2k)io.k8s.apimachinery.pkg.runtime.RawExtension, which previously required a field raw to be specified (#80773, @jennybuckley)conditions in apiextensions.v1beta1.CustomResourceDefinitionStatus and apiextensions.v1.CustomResourceDefinitionStatus is now optional instead of required. (#64996, @roycaihw)LastTransitionTime is now updated. (#69655, @CaoShuFeng)metadata.generation=1 to old CustomResources. (#82005, @sttts)Patch method to ScaleInterface (#80699, @knight42)api-approved.kubernetes.io set to either unapproved.* or a link to the pull request approving the schema. See https://github.com/kubernetes/enhancements/pull/1111 for more details. (#79992, @deads2k)kubectl set config hangs and uses 100% CPU on some invalid property names (#79000, @pswica)kubectl get --watch-only when watching a single resource (#79345, @liggitt)--ignore-not-found continue processing when encountering error. (#82120, @soltysh)service.beta.kubernetes.io/azure-pip-name to specify the public IP name for Azure load balancer. (#81213, @nilo19)service.beta.kubernetes.io/aws-load-balancer-eip-allocations to assign AWS EIP to the newly created Network Load Balancer. Number of allocations and subnets must match. (#69263, @brooksgarrett)LoadBalancerName and LoadBalancerResourceGroup to allow the corresponding customizations of azure load balancer. (#81054, @nilo19)kubeadm join --discovery-file when using discovery files with embedded credentials (#80675, @fabriziopandini)kubeadm init phase certs. (#78556, @neolit123)/var/lib/kubelet for Linux only (#81494, @Klaven)--cri-socket flag does not work for kubeadm reset (#79498, @SataQiu)kubeadm join fails if file-based discovery is too long, with a default timeout of 5 minutes. (#80804, @olivierlemasle)/home/kubernetes/bin/nvidia/vulkan/icd.d on the host to /etc/vulkan/icd.d inside containers requesting GPU. (#78868, @chardch)--pod-network-cidr flag to init or use the podSubnet field in the kubeadm config to pass a comma separated list of pod CIDRs. (#79033, @Arvinderpal)--control-plane-endpoint flag for controlPlaneEndpoint (#79270, @SataQiu)--v>=5 (#80937, @neolit123)--kubernetes-version to kubeadm init phase certs ca and kubeadm init phase kubeconfig(#80115, @gyuho)upgrade diff (#80025, @SataQiu)E2E_USE_GO_RUNNER will cause the tests to be run with the new golang-based test runner rather than the current bash wrapper. (#79284, @johnSchnake)The 404 request handler for the GCE Ingress load balancer now exports prometheus metrics, including:
http_404_request_total (the number of 404 requests handled)http_404_request_duration_ms (the amount of time the server took to respond in ms)Also includes percentile groupings. The directory for the default 404 handler includes instructions on how to enable prometheus for monitoring and setting alerts. (#79106, @vbannai)
kube-proxy --cleanup will return the correct exit code if the cleanup was successful (#78775, @johscheuer)v=5 (#80100, @andrewsykim)KUBE-MARK-DROP chain in kube-proxy IPVS mode. The chain is ensured for both IPv4 and IPv6 in dual-stack operation. (#82214, @uablrek)node.kubernetes.io/exclude-balancer and node.kubernetes.io/exclude-disruption labels in alpha to prevent cluster deployers from being dependent on the optional node-role labels which not all clusters may provide. (#80238, @smarterclayton)--cpu-manager-policy flag will now cause the kubelet to fail instead of simply ignoring the flag and running the cpumanager’s default policy instead. (#80294, @klueska)nil or empty field when calculating container hash value to avoid hash changed. For a new field with a non-nil default value in the container spec, the hash would still get changed. (#57741, @dixudx)node-lease-renew-interval to 0.25 of lease-renew-duration (#80429, @gaorong)--cloud-provider=external and no node addresses exists (#75229, @andrewsykim)post-filter extension point for scheduling framework (#78097, @draveness)[0, 100]. (#81015, @draveness)requestedToCapacityRatioArguments to add resources parameter that allows the users to specify the resource name along with weights for each resource to score nodes based on the request to capacity ratio. (#77688, @sudeshsh)UnschedulableAndUnresolvable status code for scheduling framework (#82034, @alculquicondor)doSafeMakeDir (#79534, @odinuge)skuname or storageaccounttype. (#80837, @rmweir)/var/lib/kubelet/pods) symbolically links to another disk device's directory (#79094, @gaorong)framework.WaitForPodsWithLabelRunningReady (#78687, @pohly)TerminationGracePeriodSeconds to the test framework API (#82170, @vivekbagade)/test/e2e/framework: Adds a flag non-blocking-taints which allows tests to run in environments with tainted nodes. String value should be a comma-separated list. (#81043, @johnSchnake)framework.ExpectNoError no longer logs the error and instead relies on using the new log.Fail as gomega fail handler. (#80253, @pohly)%USERPROFILE% is now preferred over %HOMEDRIVE%\%HOMEPATH% as the home folder if %HOMEDRIVE%\%HOMEPATH% does not contain a .kube\config file, and %USERPROFILE% exists and is writable. (#73923, @liggitt)