Hi Paolo,

Yes, you would need to bring up a controller with the same node ID. I have
updated the KIP to be explicit about that.

Best,
Kevin Wu

On Tue, May 5, 2026 at 8:23 AM TaiJu Wu <[email protected]> wrote:

> Hi Kevin,
>
> TJ0:
> Could we remove a controller if auto join is enabled because the controller
> will join to cluster as voter immediately.
>
> Best regards,
> TaiJuWu
>
>
> Paolo Patierno <[email protected]> 於 2026年5月5日週二 下午5:52寫道:
>
> > Hi Kevin,
> > I know you started the vote but I have just one little addition.
> > In the "Compatibility, Deprecation, and Migration Plan" section you
> > mention:
> >
> > > The main reason for not supporting this in existing clusters is that in
> > many environments, operators can simply bring up another controller node
> to
> > "refresh" its registration.
> >
> > I think you should specify that the new controller has to have the same
> ID
> > (to "refresh" its registration), it can't be a new controller with any
> ID.
> > Is that right?
> >
> > Thanks,
> > Paolo
> >
> > On Fri, 1 May 2026 at 20:49, Kevin Wu <[email protected]> wrote:
> >
> > > Hi Jun,
> > >
> > > Thanks for the reply.
> > >
> > > RE JR4: Sounds good. I have added this user experience to the KIP.
> > >
> > > Best,
> > > Kevin Wu
> > >
> > > On Fri, May 1, 2026 at 12:33 PM Jun Rao via dev <[email protected]>
> > > wrote:
> > >
> > > > Hi, Kevin,
> > > >
> > > > Thanks for the reply.
> > > >
> > > > JR4. Your explanation makes sense. Perhaps we could add another user
> > > > experience: "Remove a KRaft voter in a dynamic quorum and keep it
> > > > registered as an observer controller". In this case, the user will
> run
> > > > `kafka-metadata-quorum remove-controller` without the `--unregister`
> > > flag.
> > > >
> > > > Jun
> > > >
> > > > On Thu, Apr 30, 2026 at 4:59 PM Kevin Wu <[email protected]>
> > wrote:
> > > >
> > > > > Hi Jun,
> > > > >
> > > > > Thanks for the reply.
> > > > >
> > > > > RE JR4: To me, the main motivation for having an explicit
> > > `--unregister`
> > > > > flag is that `remove-controller` and `unregister-controller` assume
> > two
> > > > > different things about the supplied node. For removing a node from
> > the
> > > > > KRaft voter set, no assumption is made about whether the node is
> > > running
> > > > > anymore -- Kafka supports either case. However, the act of
> > > unregistering
> > > > a
> > > > > controller requires assuming that the node will "not be around
> soon."
> > > > This
> > > > > is because subsequent feature upgrades will no longer consider the
> > > > > supported levels of an unregistered controller.
> > > > >
> > > > > An operator may decide to keep a node around as an observer,
> possibly
> > > > with
> > > > > the intention to make it a voter in the future. Making the
> > > unregistration
> > > > > always occur alongside voter removal would make the observer
> > controller
> > > > in
> > > > > the example above unregister and then re-register because the node
> is
> > > > still
> > > > > around. This allows for the feature upgrade race I mentioned
> > previously
> > > > > (i.e. controller unregisters, operator upgrades a feature that
> should
> > > not
> > > > > be supported, controller re-registers). Therefore, I think we
> should
> > > have
> > > > > an explicit `--unregister` flag for `remove-controller` since the
> > > > > assumptions around the state of the cluster change compared to the
> > base
> > > > > command. What do you think?
> > > > >
> > > > > RE JR5: Yeah, I believe so. Thanks for catching this case. One
> could
> > > > > specify controller.quorum.bootstrap.servers instead of
> > > > > controller.quorum.voters on a controller in a static quorum. This
> > would
> > > > be
> > > > > a valid static config that passes the check in
> > > > >
> > > > >
> > > >
> > >
> >
> `KafkaConfig#validateControllerQuorumVotersMustContainNodeIdForKRaftController`.
> > > > > I have updated the KIP with these changes.
> > > > >
> > > > > RE JR6: Yes, it should say "every Kafka node." I have updated the
> KIP
> > > to
> > > > > fix this.
> > > > >
> > > > > Best,
> > > > > Kevin Wu
> > > > >
> > > > > On Thu, Apr 30, 2026 at 6:12 PM Jun Rao via dev <
> > [email protected]>
> > > > > wrote:
> > > > >
> > > > > > Hi, Kevin,
> > > > > >
> > > > > > Thanks for the reply.
> > > > > >
> > > > > > JR4. Is there a use case for `kafka-metadata-quorum
> > > remove-controller`
> > > > > > without the `--unregister` flag? If not, could we remove the
> > > > --unregister
> > > > > > flag?
> > > > > >
> > > > > > JR5. For the second user experience "Unregister an observer
> > > controller
> > > > > in a
> > > > > > dynamic quorum", one can have and remove an observer controller
> in
> > > the
> > > > > > static quorum too, right?
> > > > > >
> > > > > > JR6. "Ensure the stopped voter is not part of
> > > controller.quorum.voters
> > > > on
> > > > > > any other Kafka nodes"
> > > > > > "any other Kafka nodes" should be "every Kafka node", right?
> > > > > >
> > > > > > Jun
> > > > > >
> > > > > > On Mon, Apr 27, 2026 at 1:33 PM Kevin Wu <[email protected]
> >
> > > > wrote:
> > > > > >
> > > > > > > Hi Jun,
> > > > > > >
> > > > > > > Thanks for the feedback.
> > > > > > >
> > > > > > > I have updated the KIP to make a separate section detailing the
> > > user
> > > > > > > experience.
> > > > > > >
> > > > > > > Best,
> > > > > > > Kevin Wu
> > > > > > >
> > > > > > > On Mon, Apr 27, 2026 at 12:05 PM Jun Rao via dev <
> > > > [email protected]
> > > > > >
> > > > > > > wrote:
> > > > > > >
> > > > > > > > Hi, Kevin,
> > > > > > > >
> > > > > > > > Thanks for the reply.
> > > > > > > >
> > > > > > > > It would be useful to have a separate user experience section
> > > that
> > > > > > > > documents the steps for common scenarios involving the tools.
> > > > > > > >
> > > > > > > > The scenarios are:
> > > > > > > > 1. Remove a voter in dynamic KRaft quorum
> > > > > > > > stop the voter
> > > > > > > > run kafka-metadata-quorum remove-controller with --unregister
> > > > > > > > 2. Unregister an observer controller
> > > > > > > > stop the observer
> > > > > > > > run kafka-cluster unregister-controller
> > > > > > > > 3. Unregister a voter in a static KRaft quorum when the
> static
> > > > voter
> > > > > > set
> > > > > > > is
> > > > > > > > mistakenly configured.
> > > > > > > > stop the voter
> > > > > > > > run kafka-cluster unregister-controller
> > > > > > > > remove voter from controller.quorum.voters ?
> > > > > > > >
> > > > > > > > Jun
> > > > > > > >
> > > > > > > > On Fri, Apr 24, 2026 at 11:49 AM Kevin Wu <
> > > [email protected]>
> > > > > > > wrote:
> > > > > > > >
> > > > > > > > > Hi Jun,
> > > > > > > > >
> > > > > > > > > Thanks for the discussion.
> > > > > > > > > Yeah, those are the scenarios for using these tools. I have
> > > > > > documented
> > > > > > > > > their usage in the KIP.
> > > > > > > > >
> > > > > > > > > Best,
> > > > > > > > > Kevin Wu
> > > > > > > > >
> > > > > > > > > On Thu, Apr 23, 2026 at 11:51 AM Jun Rao via dev <
> > > > > > [email protected]
> > > > > > > >
> > > > > > > > > wrote:
> > > > > > > > >
> > > > > > > > > > Hi, Kevin,
> > > > > > > > > >
> > > > > > > > > > Thanks for the reply.
> > > > > > > > > >
> > > > > > > > > > Your suggestion sounds good to me. It would be useful to
> > > > document
> > > > > > the
> > > > > > > > > usage
> > > > > > > > > > of those tools. The scenarios are:
> > > > > > > > > > 1. Remove a voter in dynamic KRaft quorum
> > > > > > > > > > 2. Unregister an observer controller
> > > > > > > > > > 3. Unregister a voter in a static KRaft quorum when the
> > > static
> > > > > > voter
> > > > > > > > set
> > > > > > > > > is
> > > > > > > > > > mistakenly configured.
> > > > > > > > > >
> > > > > > > > > > For item 3, could you document how it works? Does one
> need
> > to
> > > > > stop
> > > > > > > the
> > > > > > > > > > misconfigured voter first and then unregister it?
> > > > > > > > > >
> > > > > > > > > > Are there other scenarios?
> > > > > > > > > >
> > > > > > > > > > Jun
> > > > > > > > > >
> > > > > > > > > > On Thu, Apr 23, 2026 at 8:22 AM Kevin Wu <
> > > > [email protected]
> > > > > >
> > > > > > > > wrote:
> > > > > > > > > >
> > > > > > > > > > > Hi Jun,
> > > > > > > > > > >
> > > > > > > > > > > Thanks for the replies.
> > > > > > > > > > >
> > > > > > > > > > > RE JR3: I would like the design of this feature to not
> > > > > introduce
> > > > > > > more
> > > > > > > > > > > coupling of the KRaft and metadata layers. Observer
> > > > controllers
> > > > > > are
> > > > > > > > > > > supported, but they are a KRaft concept, so it should
> not
> > > be
> > > > > > known
> > > > > > > to
> > > > > > > > > the
> > > > > > > > > > > metadata layer whether or not a given controller is a
> > voter
> > > > or
> > > > > > > > > observer.
> > > > > > > > > > >
> > > > > > > > > > > What do you think about the following documentation and
> > > > > execution
> > > > > > > > > pattern
> > > > > > > > > > > regarding these CLI commands?
> > > > > > > > > > >
> > > > > > > > > > > `kafka-cluster unregister-controller` is a command for
> > > users
> > > > > when
> > > > > > > > they
> > > > > > > > > > want
> > > > > > > > > > > to unregister a controller from the cluster. We can
> > > document
> > > > > that
> > > > > > > > this
> > > > > > > > > is
> > > > > > > > > > > potentially unsafe and should only be done if the
> > operator
> > > > does
> > > > > > not
> > > > > > > > > > intend
> > > > > > > > > > > to bring back up that controller. `kafka-cluster
> > > > > > > > unregister-controller`
> > > > > > > > > > > works irrespective of the quorum mode.
> > > > > > > > > > >
> > > > > > > > > > > Going forward, running `kafka-metadata-quorum
> > > > > remove-controller`
> > > > > > > > > removes
> > > > > > > > > > a
> > > > > > > > > > > controller as a KRaft voter, and continues to only be
> > > > supported
> > > > > > in
> > > > > > > a
> > > > > > > > > > > dynamic quorum cluster. I still think the unregistering
> > > > > behavior
> > > > > > > > should
> > > > > > > > > > be
> > > > > > > > > > > an additional flag, because having an observer
> controller
> > > > that
> > > > > is
> > > > > > > > still
> > > > > > > > > > > registered to the cluster is a valid configuration in
> > > Kafka.
> > > > I
> > > > > > > think
> > > > > > > > of
> > > > > > > > > > > `kafka-metadata-quorum remove-controller --unregister`
> > as a
> > > > > > > > "built-in"
> > > > > > > > > > CLI
> > > > > > > > > > > script, since removing a voter and unregistering it
> from
> > > the
> > > > > > > cluster
> > > > > > > > is
> > > > > > > > > > > probably a very common usage pattern. This command will
> > > only
> > > > > send
> > > > > > > > > > > UnregisterController RPC if the cluster supports
> dynamic
> > > > > quorum,
> > > > > > so
> > > > > > > > the
> > > > > > > > > > > overall command behavior is consistent with how it is
> > today
> > > > > with
> > > > > > > > > respect
> > > > > > > > > > to
> > > > > > > > > > > the kraft.version level of the cluster. If the cluster
> > does
> > > > not
> > > > > > > > support
> > > > > > > > > > > dynamic quorum, the CLI can direct the user to instead
> > run
> > > > the
> > > > > > > > > > > `kafka-cluster unregister-controller` command.
> > > > > > > > > > >
> > > > > > > > > > > Best,
> > > > > > > > > > > Kevin Wu
> > > > > > > > > > >
> > > > > > > > > > > On Tue, Apr 21, 2026 at 5:39 PM Jun Rao via dev <
> > > > > > > > [email protected]>
> > > > > > > > > > > wrote:
> > > > > > > > > > >
> > > > > > > > > > > > Hi, Kevin,
> > > > > > > > > > > >
> > > > > > > > > > > > Thanks for the reply.
> > > > > > > > > > > >
> > > > > > > > > > > > JR2. Good point on auto-join. I think we can
> introduce
> > > the
> > > > > > > > > > > > new UnregisterControllerRequest and keep the
> auto-join
> > > > > behavior
> > > > > > > as
> > > > > > > > is
> > > > > > > > > > > > (i.e., without unregistering the controller when
> > removing
> > > > the
> > > > > > old
> > > > > > > > > > > instance
> > > > > > > > > > > > from the voter). The command "kafka-metadata-quorum
> > > > > > > > > remove-controller"
> > > > > > > > > > > will
> > > > > > > > > > > > send two separate RPC requests,
> RemoveRaftVoterRequest
> > > and
> > > > > > > > > > > > UnregisterControllerRequest as documented in the KIP.
> > > > > > > > > > > >
> > > > > > > > > > > > JR3. When will a user use the command "kafka-cluster
> > > > > > > > > > > > unregister-controller"? Is this only for
> unregistering
> > an
> > > > > > > observer
> > > > > > > > > > > > controller? If the observer controller is currently
> > > > > supported,
> > > > > > we
> > > > > > > > can
> > > > > > > > > > add
> > > > > > > > > > > > that command. It would be useful to document the
> usage
> > > for
> > > > > both
> > > > > > > > > > commands.
> > > > > > > > > > > >
> > > > > > > > > > > > Jun
> > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > > > > > > > On Tue, Apr 21, 2026 at 9:25 AM Kevin Wu <
> > > > > > [email protected]
> > > > > > > >
> > > > > > > > > > wrote:
> > > > > > > > > > > >
> > > > > > > > > > > > > Hi Jun,
> > > > > > > > > > > > >
> > > > > > > > > > > > > Thanks for the reply.
> > > > > > > > > > > > >
> > > > > > > > > > > > > RE JR1: Yeah, I will update KIP to touch on this
> > static
> > > > > > quorum
> > > > > > > > edge
> > > > > > > > > > > case.
> > > > > > > > > > > > >
> > > > > > > > > > > > > RE JR2: That seems reasonable to me, since we would
> > > avoid
> > > > > two
> > > > > > > RPC
> > > > > > > > > > hops
> > > > > > > > > > > > (one
> > > > > > > > > > > > > for RemoveVoter, one for UnregisterController). One
> > > thing
> > > > > to
> > > > > > > note
> > > > > > > > > is
> > > > > > > > > > > that
> > > > > > > > > > > > > with KIP-1186
> > > > > > > > > > > > > <
> > > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> https://urldefense.com/v3/__https://cwiki.apache.org/confluence/display/KAFKA/KIP-1186*3A*Update*AddRaftVoterRequest*RPC*to*support*auto-join__;JSsrKysrKw!!Ayb5sqE7!phwOrPrBZoQb1P44rCfpPBt74v80NjCTOGhgaRQx1XFXCy1x61QR9b9xw3zfvo-aFvVsFYczOxbTVtGeJkFHCg$
> > > > > > > > > > > > > >,
> > > > > > > > > > > > > besides operators manually removing controllers,
> > > observer
> > > > > > > > > controllers
> > > > > > > > > > > > > themselves can send `RemoveRaftVoter` to remove
> their
> > > old
> > > > > > > > > > incarnations
> > > > > > > > > > > > from
> > > > > > > > > > > > > the voter set as part of the auto-join feature.
> With
> > > > > > auto-join
> > > > > > > > and
> > > > > > > > > > this
> > > > > > > > > > > > > proposed behavior, explicitly removing a
> controller's
> > > old
> > > > > > > > > > registration
> > > > > > > > > > > > > alongside its old voter set entry can lead to
> > > > "unsupported"
> > > > > > > > > upgrades
> > > > > > > > > > in
> > > > > > > > > > > > the
> > > > > > > > > > > > > cluster. An operator doing these steps manually can
> > be
> > > > > argued
> > > > > > > as
> > > > > > > > > > > > > misconfiguring the cluster, but the auto-join
> feature
> > > > > > allowing
> > > > > > > > for
> > > > > > > > > > this
> > > > > > > > > > > > > scenario seems like a bug.
> > > > > > > > > > > > >
> > > > > > > > > > > > > Consider the below example with auto-join enabled:
> 3
> > > > > > > controllers
> > > > > > > > in
> > > > > > > > > > the
> > > > > > > > > > > > > voter set (A,B,C) where A supports feature levels
> > > > X=[0-1],
> > > > > B
> > > > > > > > > supports
> > > > > > > > > > > > > feature levels X=[0-1], but C only supports X=0.
> > > > Currently,
> > > > > > > node
> > > > > > > > A
> > > > > > > > > is
> > > > > > > > > > > the
> > > > > > > > > > > > > active controller, all 3 controllers are
> registered,
> > > but
> > > > > > > > upgrading
> > > > > > > > > > > > feature
> > > > > > > > > > > > > X to feature level 1 is not supported because C
> does
> > > not
> > > > > > > support
> > > > > > > > > it.
> > > > > > > > > > > > > Controller C restarts with a new disk (now
> > represented
> > > as
> > > > > > C').
> > > > > > > > The
> > > > > > > > > > > > > auto-join code runs to first remove C from the
> voter
> > > set,
> > > > > and
> > > > > > > > then
> > > > > > > > > > > remove
> > > > > > > > > > > > > the registration for C. These records are committed
> > via
> > > > > > nodes A
> > > > > > > > and
> > > > > > > > > > B.
> > > > > > > > > > > > Now,
> > > > > > > > > > > > > from the active controller's perspective, the
> cluster
> > > > does
> > > > > > > > support
> > > > > > > > > > > > > upgrading feature X to level 1. There is a race
> > between
> > > > C'
> > > > > > > adding
> > > > > > > > > > > itself
> > > > > > > > > > > > > back to the KRaft voter set and re-registering
> > itself,
> > > > and
> > > > > a
> > > > > > > > > > potential
> > > > > > > > > > > > > feature level upgrade. Another interesting thing to
> > > note
> > > > > > after
> > > > > > > > > > looking
> > > > > > > > > > > at
> > > > > > > > > > > > > the code is that controllers can register even if
> > they
> > > do
> > > > > not
> > > > > > > > > support
> > > > > > > > > > > the
> > > > > > > > > > > > > finalized features of the cluster, which is
> different
> > > > from
> > > > > > > broker
> > > > > > > > > > > > > registration. In Kafka's current code, the original
> > > > > > > registration
> > > > > > > > > for
> > > > > > > > > > C
> > > > > > > > > > > > > stays in the log after C is removed as a voter by
> > > > > auto-join,
> > > > > > > > which
> > > > > > > > > > > > prevents
> > > > > > > > > > > > > an upgrade of feature X. At some point, the
> > > registration
> > > > > for
> > > > > > C
> > > > > > > is
> > > > > > > > > > > updated
> > > > > > > > > > > > > by C' because C' is a different process
> incarnation,
> > > but
> > > > a
> > > > > > > > > > registration
> > > > > > > > > > > > > that blocks X's upgrade is always in the log.
> > > > > > > > > > > > >
> > > > > > > > > > > > > Therefore, Kafka should not unregister a controller
> > > when
> > > > > > > > auto-join
> > > > > > > > > > > > removes
> > > > > > > > > > > > > a controller from the voter set. This means
> > including a
> > > > new
> > > > > > RPC
> > > > > > > > > > version
> > > > > > > > > > > > for
> > > > > > > > > > > > > `RemoveRaftVoter` that introduces a boolean field
> > > telling
> > > > > the
> > > > > > > > > active
> > > > > > > > > > > > > controller whether to also unregister the
> controller.
> > > > This
> > > > > > > field
> > > > > > > > > > would
> > > > > > > > > > > be
> > > > > > > > > > > > > completely ignored by the raft layer, and instead
> > would
> > > > be
> > > > > > > > handled
> > > > > > > > > at
> > > > > > > > > > > the
> > > > > > > > > > > > > ControllerApis level. I think it is fine to
> > unregister
> > > a
> > > > > > > > controller
> > > > > > > > > > > > > whenever the operator runs `kafka-metadata-quorum
> > > > > > > > > remove-controller`
> > > > > > > > > > > for
> > > > > > > > > > > > a
> > > > > > > > > > > > > smooth UX with dynamic quorum. What do you think?
> > > > > > > > > > > > >
> > > > > > > > > > > > > RE JR3: Maybe we can document this better as part
> of
> > > the
> > > > > code
> > > > > > > > > changes
> > > > > > > > > > > to
> > > > > > > > > > > > > this KIP, but in my opinion, the kafka-cluster tool
> > > deals
> > > > > > with
> > > > > > > > > > cluster
> > > > > > > > > > > > > membership (brokers and controllers), which is a
> > > metadata
> > > > > > layer
> > > > > > > > > > > concept.
> > > > > > > > > > > > If
> > > > > > > > > > > > > you look at the `list-endpoints` command, you can
> > list
> > > > out
> > > > > > the
> > > > > > > > > > > registered
> > > > > > > > > > > > > controller endpoints. Alternatively, the
> > > > > > kafka-metadata-quorum
> > > > > > > > tool
> > > > > > > > > > > deals
> > > > > > > > > > > > > with KRaft, which knows about concepts like leader,
> > > > voter,
> > > > > > and
> > > > > > > > > > > observers.
> > > > > > > > > > > > > The `add-controller` and `remove-controller`
> > > sub-commands
> > > > > > > > > > inadvertently
> > > > > > > > > > > > > deal with controllers (since controllers can be
> > > voters),
> > > > > but
> > > > > > > the
> > > > > > > > > > > > `describe`
> > > > > > > > > > > > > sub-command tree also shows information about
> > brokers,
> > > > > which
> > > > > > > are
> > > > > > > > > > > > observers
> > > > > > > > > > > > > to KRaft. My decision to include the
> > > > > `unregister-controller`
> > > > > > > > > command
> > > > > > > > > > in
> > > > > > > > > > > > the
> > > > > > > > > > > > > `kafka-cluster` tool is mainly motivated by this
> > > > > distinction.
> > > > > > > > > > > > Additionally,
> > > > > > > > > > > > > if we only send `RemoveVoterRequest` in
> > > > > `remove-controller`,
> > > > > > it
> > > > > > > > > seems
> > > > > > > > > > > > hacky
> > > > > > > > > > > > > to direct users to use that command for
> unregistering
> > > any
> > > > > > > > > controller,
> > > > > > > > > > > > since
> > > > > > > > > > > > > for observers, the remove voter logic of that
> request
> > > > will
> > > > > > > always
> > > > > > > > > > fail
> > > > > > > > > > > in
> > > > > > > > > > > > > the raft layer. What do you think?
> > > > > > > > > > > > >
> > > > > > > > > > > > > Best,
> > > > > > > > > > > > > Kevin Wu
> > > > > > > > > > > > >
> > > > > > > > > > > > >
> > > > > > > > > > > > > On Tue, Apr 21, 2026 at 8:17 AM Paolo Patierno <
> > > > > > > > > > > [email protected]
> > > > > > > > > > > > >
> > > > > > > > > > > > > wrote:
> > > > > > > > > > > > >
> > > > > > > > > > > > > > Hi Kevin,
> > > > > > > > > > > > > > thanks for the KIP.
> > > > > > > > > > > > > > From reading it, it's not clear because not
> > explicit,
> > > > > but I
> > > > > > > > would
> > > > > > > > > > > > assume
> > > > > > > > > > > > > > you are going to expose a new
> unregisterController
> > > > method
> > > > > > > > through
> > > > > > > > > > the
> > > > > > > > > > > > > > AdminClient API as well, is my assumption right?
> > > > > > > > > > > > > > I expect it would be used underneath by the tools
> > you
> > > > are
> > > > > > > going
> > > > > > > > > to
> > > > > > > > > > > > > modify.
> > > > > > > > > > > > > > Having such support within the AdminClient API is
> > > > > important
> > > > > > > > when
> > > > > > > > > > the
> > > > > > > > > > > > > > operator is not a human to run the tool but a
> > > > Kubernetes
> > > > > > > > operator
> > > > > > > > > > > (i.e.
> > > > > > > > > > > > > > Strimzi) with the need to unregister a
> controller.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > Thanks,
> > > > > > > > > > > > > > Paolo.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > On Mon, 20 Apr 2026 at 21:57, Kevin Wu <
> > > > > > > [email protected]
> > > > > > > > >
> > > > > > > > > > > wrote:
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > > Hi Jun,
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > Thanks for the reply.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > RE JR1: I would say the main use case is
> dynamic
> > > > > quorums,
> > > > > > > > since
> > > > > > > > > > the
> > > > > > > > > > > > > > concept
> > > > > > > > > > > > > > > of the observer controller becomes a thing in
> > that
> > > > > world.
> > > > > > > > > > However,
> > > > > > > > > > > > > there
> > > > > > > > > > > > > > is
> > > > > > > > > > > > > > > a static quorum edge case if the operator
> > > > misconfigures
> > > > > > > > > > > > > > > `controller.quorum.voters`. If a new controller
> > > voter
> > > > > > > > > mistakenly
> > > > > > > > > > > > joins
> > > > > > > > > > > > > > the
> > > > > > > > > > > > > > > cluster, it will also persist a registration
> > > record.
> > > > In
> > > > > > my
> > > > > > > > > > opinion,
> > > > > > > > > > > > > there
> > > > > > > > > > > > > > > should be a way to remove a controller
> > registration
> > > > via
> > > > > > > > > > AdminClient
> > > > > > > > > > > > CLI
> > > > > > > > > > > > > > in
> > > > > > > > > > > > > > > all quorum modes.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > RE JR2: Yes, the existing command only removes
> > the
> > > > > voter,
> > > > > > > but
> > > > > > > > > > does
> > > > > > > > > > > > not
> > > > > > > > > > > > > > > unregister the controller. I left it as a
> > separate
> > > > flag
> > > > > > for
> > > > > > > > now
> > > > > > > > > > > > because
> > > > > > > > > > > > > > > they are "separate" operations in that being a
> > raft
> > > > > voter
> > > > > > > is
> > > > > > > > a
> > > > > > > > > > > subset
> > > > > > > > > > > > > of
> > > > > > > > > > > > > > > being a controller in dynamic quorums, but I am
> > not
> > > > > > opposed
> > > > > > > > to
> > > > > > > > > > > making
> > > > > > > > > > > > > > this
> > > > > > > > > > > > > > > command try to do both (remove voter and
> > unregister
> > > > the
> > > > > > > > > > controller)
> > > > > > > > > > > > by
> > > > > > > > > > > > > > > default. In my opinion, an observer controller
> is
> > > > > > "useless"
> > > > > > > > in
> > > > > > > > > > that
> > > > > > > > > > > > it
> > > > > > > > > > > > > > does
> > > > > > > > > > > > > > > not participate in the leader election or
> > > replication
> > > > > > parts
> > > > > > > > of
> > > > > > > > > > the
> > > > > > > > > > > > > KRaft
> > > > > > > > > > > > > > > protocol, so I see no issue with doing both
> > > > operations
> > > > > > > > always.
> > > > > > > > > > > > However,
> > > > > > > > > > > > > > an
> > > > > > > > > > > > > > > operator may want observer controllers around
> for
> > > > other
> > > > > > > > reasons
> > > > > > > > > > > like
> > > > > > > > > > > > > > > redundancy. Do you (or others) have any insight
> > > into
> > > > > how
> > > > > > > > users
> > > > > > > > > > may
> > > > > > > > > > > be
> > > > > > > > > > > > > > > configuring clusters with observer controllers?
> > If
> > > > > not, I
> > > > > > > > think
> > > > > > > > > > it
> > > > > > > > > > > is
> > > > > > > > > > > > > > okay
> > > > > > > > > > > > > > > to remove the flag and make it the default
> > behavior
> > > > of
> > > > > > > > > > > > > > > `kafka-metadata-quorum remove-controller`.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > RE JR3: Not exactly. The `kafka-metadata-quorum
> > > > > > > > > remove-controller
> > > > > > > > > > > ...
> > > > > > > > > > > > > > > --unregister` sends 2 RPCs to the active
> > > controller,
> > > > > one
> > > > > > to
> > > > > > > > > > remove
> > > > > > > > > > > a
> > > > > > > > > > > > > node
> > > > > > > > > > > > > > > from the voter set, and another to unregister
> the
> > > > node.
> > > > > > The
> > > > > > > > > > > > > > `kafka-cluster
> > > > > > > > > > > > > > > unregister-controller` command just sends 1 RPC
> > to
> > > > the
> > > > > > > active
> > > > > > > > > > > > > controller
> > > > > > > > > > > > > > to
> > > > > > > > > > > > > > > unregister the node. My motivation for having
> two
> > > > > > separate
> > > > > > > > > > commands
> > > > > > > > > > > > is
> > > > > > > > > > > > > > > because `remove-controller` is associated with
> > > > dynamic
> > > > > > > > quorum,
> > > > > > > > > > > since
> > > > > > > > > > > > > the
> > > > > > > > > > > > > > > `RemoveRaftVoterRPC` will fail if the
> > > > kraft.version=0.
> > > > > > What
> > > > > > > > do
> > > > > > > > > > you
> > > > > > > > > > > > > think?
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > RE JR4: I have updated the sections for the CLI
> > > > > commands
> > > > > > in
> > > > > > > > the
> > > > > > > > > > KIP
> > > > > > > > > > > > to
> > > > > > > > > > > > > > add
> > > > > > > > > > > > > > > this information.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > RE JR5: This is describing the current
> > > implementation
> > > > > of
> > > > > > > the
> > > > > > > > > > > > > > > ControllerRegistrationManager, which will
> listen
> > to
> > > > the
> > > > > > > > > metadata
> > > > > > > > > > > log
> > > > > > > > > > > > > and
> > > > > > > > > > > > > > > send ControllerRegistrationRequest when the
> local
> > > > node
> > > > > id
> > > > > > > is
> > > > > > > > > not
> > > > > > > > > > > > > > registered
> > > > > > > > > > > > > > > in the log. It looks like this is slightly
> > > different
> > > > > from
> > > > > > > how
> > > > > > > > > we
> > > > > > > > > > > > handle
> > > > > > > > > > > > > > > broker registration in BrokerLifecycleManager.
> > > > > Currently,
> > > > > > > > this
> > > > > > > > > > code
> > > > > > > > > > > > > path
> > > > > > > > > > > > > > > never executes because controller registrations
> > > > cannot
> > > > > be
> > > > > > > > > > removed.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > Best,
> > > > > > > > > > > > > > > Kevin Wu
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > On Fri, Apr 17, 2026 at 2:08 PM Jun Rao via
> dev <
> > > > > > > > > > > > [email protected]>
> > > > > > > > > > > > > > > wrote:
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > Hi, Kevin,
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > Thanks for the KIP. A few comments.
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > JR1. I guess this is only intended for
> dynamic
> > > > KRaft
> > > > > > > > quorums?
> > > > > > > > > > If
> > > > > > > > > > > > so,
> > > > > > > > > > > > > it
> > > > > > > > > > > > > > > > would be useful to clarify that.
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > JR2. kafka-metadata-quorum remove-controller
> > > > > > > > --controller-id
> > > > > > > > > > 9990
> > > > > > > > > > > > > > > > --controller-directory-id EXAMPLE_UUID
> > > --unregister
> > > > > > > > > > > > > > > > So, the existing remove-controller logic only
> > > > changes
> > > > > > the
> > > > > > > > > voter
> > > > > > > > > > > > set,
> > > > > > > > > > > > > > but
> > > > > > > > > > > > > > > > doesn't unregister the controller? Should we
> > just
> > > > > > always
> > > > > > > do
> > > > > > > > > > these
> > > > > > > > > > > > two
> > > > > > > > > > > > > > > > together? Is there a use case for only
> > removing a
> > > > > > > > controller
> > > > > > > > > > from
> > > > > > > > > > > > the
> > > > > > > > > > > > > > > voter
> > > > > > > > > > > > > > > > set, but not unregsitering?
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > JR3. Is kafka-cluster unregister-controller
> > > > > equivalent
> > > > > > to
> > > > > > > > > > > > > > > > kafka-metadata-quorum remove-controller
> > > > > --controller-id
> > > > > > > > 9990
> > > > > > > > > > > > > > > > --controller-directory-id EXAMPLE_UUID
> > > > --unregister?
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > JR4. Could you describe the underlying
> workflow
> > > for
> > > > > > each
> > > > > > > > new
> > > > > > > > > > > > command
> > > > > > > > > > > > > > > (RPCs
> > > > > > > > > > > > > > > > sent, metadata records generated, actions
> taken
> > > by
> > > > > the
> > > > > > > > > > > controller,
> > > > > > > > > > > > > > etc)?
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > JR5. "The registration manager of an
> > unregistered
> > > > > > > > controller
> > > > > > > > > > > > already
> > > > > > > > > > > > > > > > attempts to re-register with the active
> > > controller.
> > > > > > This
> > > > > > > is
> > > > > > > > > to
> > > > > > > > > > > > > prevent
> > > > > > > > > > > > > > > > accidental unregistrations."
> > > > > > > > > > > > > > > > I don't quite understand this. Why will an
> > > > > unregistered
> > > > > > > > > > > controller
> > > > > > > > > > > > > > > attempt
> > > > > > > > > > > > > > > > to re-register?
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > Jun
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > On Fri, Apr 3, 2026 at 11:31 AM Kevin Wu <
> > > > > > > > > > [email protected]
> > > > > > > > > > > >
> > > > > > > > > > > > > > wrote:
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > > Hi all,
> > > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > > I would like to start a discussion on
> > KIP-1312:
> > > > > > Support
> > > > > > > > > > > > > unregistering
> > > > > > > > > > > > > > > > > controllers. Below is the KIP link.
> > > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > >
> > > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> https://urldefense.com/v3/__https://cwiki.apache.org/confluence/display/KAFKA/KIP-1312*3A*Support*unregistering*controllers__;JSsrKw!!Ayb5sqE7!phwOrPrBZoQb1P44rCfpPBt74v80NjCTOGhgaRQx1XFXCy1x61QR9b9xw3zfvo-aFvVsFYczOxbTVtFeUg-7gg$
> > > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > > > Thanks,
> > > > > > > > > > > > > > > > > Kevin Wu
> > > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > >
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > >
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > --
> > > > > > > > > > > > > > Paolo Patierno
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > *Senior Principal Software Engineer @ IBM**CNCF
> > > > > Ambassador*
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > Twitter : @ppatierno <
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> https://urldefense.com/v3/__http://twitter.com/ppatierno__;!!Ayb5sqE7!phwOrPrBZoQb1P44rCfpPBt74v80NjCTOGhgaRQx1XFXCy1x61QR9b9xw3zfvo-aFvVsFYczOxbTVtHGG-mS-Q$
> > > > > > > > > > > >
> > > > > > > > > > > > > > Linkedin : paolopatierno <
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> https://urldefense.com/v3/__http://it.linkedin.com/in/paolopatierno__;!!Ayb5sqE7!phwOrPrBZoQb1P44rCfpPBt74v80NjCTOGhgaRQx1XFXCy1x61QR9b9xw3zfvo-aFvVsFYczOxbTVtFcWWCD5g$
> > > > > > > > > > > >
> > > > > > > > > > > > > > GitHub : ppatierno <
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> https://urldefense.com/v3/__https://github.com/ppatierno__;!!Ayb5sqE7!phwOrPrBZoQb1P44rCfpPBt74v80NjCTOGhgaRQx1XFXCy1x61QR9b9xw3zfvo-aFvVsFYczOxbTVtEK-wncPw$
> > > > > > > > > > > >
> > > > > > > > > > > > > >
> > > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> >
> > --
> > Paolo Patierno
> >
> > *Senior Principal Software Engineer @ IBM**CNCF Ambassador*
> >
> > Twitter : @ppatierno <http://twitter.com/ppatierno>
> > Linkedin : paolopatierno <http://it.linkedin.com/in/paolopatierno>
> > GitHub : ppatierno <https://github.com/ppatierno>
> >
>

Reply via email to