docs(core-concepts): write the S3, pod placement and pod disruption pages - #38
Merged
Merged
Conversation
Replaces a one-line placeholder. Content is taken from the operator-go API rather than written from memory: pkg/apis/s3/v1alpha1 for the two CRDs and their defaults, pkg/s3/resolver.go for how inline/reference resolve and how the endpoint is assembled, pkg/s3/credentials.go for the secret key names, and hive-operator's ClusterConfigSpec for the product-side example. Covers S3Connection and S3Bucket, the inline-or-reference rule with its actual error strings, the ACCESS_KEY/SECRET_KEY contract and where the Secret Operator mounts it, TLS verification modes, and region. Gives pathStyle a section of its own. It defaults to false, which is right for AWS and wrong for MinIO and Ceph RGW, and nothing rejects the wrong value at admission — the resource applies, the pods start, and it fails on first object access. That is worth more than a table row. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both files were literally empty — 0 bytes in each language tree. Content comes from commons/v1alpha1 (pdb_types.go, config_types.go, cluster_types.go) and from the reconciler's affinity fold. Pod disruptions: the operator writes a PDB per role by default, so the page leads with "you are already protected". Documents that `enabled` is a pointer whose unset state means true — a role that names the block only to raise maxUnavailable keeps its PDB — that maxUnavailable defaults per product rather than to a fixed number, that roleConfig is role-scoped and role groups cannot override it, and that a PDB constrains voluntary disruptions only. Pod placement: the important part is that config.affinity replaces the layer beneath it wholesale rather than merging per member. Pinning a group with a nodeAffinity therefore discards the podAntiAffinity the product ships to spread a quorum, and nothing fails when it happens — the spec is valid and every status condition stays green. The page names the three layers in the reconciler's own words, quotes the AffinityOverridden warning event the operator emits, gives the kubectl command to find it, and shows restating the discarded member. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Aug 24, 2026
This was referenced Aug 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
First batch of stage 2 — filling in placeholder pages. Three pages, both language trees, six files.
pod-placement.mdandpod-disruptions.mdwere literally 0 bytes;s3.mdwas a single heading.Everything here is taken from the operator source in the sibling repositories, not written from memory. Sources are named per page below.
Pages
core-concepts/resources/s3.mdFrom
operator-go:pkg/apis/s3/v1alpha1(the two CRDs and their defaults),pkg/s3/resolver.go(inline/reference resolution and endpoint assembly),pkg/s3/credentials.go(secret key names). Product example fromhive-operator'sClusterConfigSpec.Covers
S3ConnectionandS3Bucket, the inline-or-reference rule with its actual error strings, theACCESS_KEY/SECRET_KEYcontract and the/kubedoop/secret/<volume>/mount, TLS verification modes, and region.pathStylegets its own section. It defaults tofalse, which is right for AWS and wrong for MinIO and Ceph RGW, and nothing rejects the wrong value at admission — the resource applies, the pods start, and it fails on first object access.core-concepts/operations/pod-disruptions.mdFrom
commons/v1alpha1/pdb_types.goandcluster_types.go.The operator writes a PDB per role by default, so the page leads with "you are already protected". Documents that
enabledis a pointer whose unset state means true (a role naming the block only to raisemaxUnavailablekeeps its PDB), thatmaxUnavailabledefaults per product rather than to a fixed number, thatroleConfigis role-scoped and role groups cannot override it, and that a PDB constrains voluntary disruptions only.core-concepts/operations/pod-placement.mdFrom
commons/v1alpha1/config_types.goand the reconciler's affinity fold (config_fold.go,generic_reconciler.go).The load-bearing point:
config.affinityreplaces the layer beneath it wholesale rather than merging per member. Pinning a group with anodeAffinitytherefore discards thepodAntiAffinitythe product ships to spread a quorum — and nothing fails when it does, since the spec is valid and every status condition stays green.The page names the three layers in the reconciler's own words, quotes the
AffinityOverriddenwarning event, gives thekubectlcommand to find it, and shows how to restate the discarded member.Testing
npm run verifyexits 0 — 52 files linted with 0 errors, both locales builtpathStyle,AffinityOverridden,maxUnavailablein the build output)onBrokenLinks: 'throw'would have failed the build otherwiseNot included, and why
core-concepts/resources/database.mdstays a placeholder.DatabaseConnectionexists inoperator-go(pkg/apis/database/v1alpha1), but greppinghive-operator,superset-operator,airflow-operatoranddolphinscheduler-operatorfinds no operator consuming it, the credential key names are not defined anywhere the way S3'sACCESS_KEY/SECRET_KEYare, and there are no default ports per driver. Documenting it now would mean inventing the user-facing contract. Better as a placeholder until an operator adopts it.Remaining stage 2 placeholders
10 pages left:
authentication,logging,service-discovery,kubernetes,kubebuilder,develop-guideline,faq,release-notes,spark-k8s-operator, anddatabase(blocked above).authenticationandlogginglook similarly well-grounded —trino-operatorusesAuthenticationClasswith static/LDAP/OIDC backends, andhive-operatorandtrino-operatorboth use the logging spec.🤖 Generated with Claude Code