mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-20 01:47:33 +00:00
cmd/{k8s-operator,k8s-proxy}: add kube-apiserver ProxyGroup type (#16266)
Adds a new k8s-proxy command to convert operator's in-process proxy to a separately deployable type of ProxyGroup: kube-apiserver. k8s-proxy reads in a new config file written by the operator, modelled on tailscaled's conffile but with some modifications to ensure multiple versions of the config can co-exist within a file. This should make it much easier to support reading that config file from a Kube Secret with a stable file name. To avoid needing to give the operator ClusterRole{,Binding} permissions, the helm chart now optionally deploys a new static ServiceAccount for the API Server proxy to use if in auth mode. Proxies deployed by kube-apiserver ProxyGroups currently work the same as the operator's in-process proxy. They do not yet leverage Tailscale Services for presenting a single HA DNS name. Updates #13358 Change-Id: Ib6ead69b2173c5e1929f3c13fb48a9a5362195d8 Signed-off-by: Tom Proctor <tomhjp@users.noreply.github.com>
This commit is contained in:
@@ -264,6 +264,7 @@ type Pod struct {
|
||||
// +optional
|
||||
TailscaleContainer *Container `json:"tailscaleContainer,omitempty"`
|
||||
// Configuration for the proxy init container that enables forwarding.
|
||||
// Not valid to apply to ProxyGroups of type "kube-apiserver".
|
||||
// +optional
|
||||
TailscaleInitContainer *Container `json:"tailscaleInitContainer,omitempty"`
|
||||
// Proxy Pod's security context.
|
||||
@@ -364,12 +365,21 @@ type Container struct {
|
||||
// the future.
|
||||
// +optional
|
||||
Env []Env `json:"env,omitempty"`
|
||||
// Container image name. By default images are pulled from
|
||||
// docker.io/tailscale/tailscale, but the official images are also
|
||||
// available at ghcr.io/tailscale/tailscale. Specifying image name here
|
||||
// will override any proxy image values specified via the Kubernetes
|
||||
// operator's Helm chart values or PROXY_IMAGE env var in the operator
|
||||
// Deployment.
|
||||
// Container image name. By default images are pulled from docker.io/tailscale,
|
||||
// but the official images are also available at ghcr.io/tailscale.
|
||||
//
|
||||
// For all uses except on ProxyGroups of type "kube-apiserver", this image must
|
||||
// be either tailscale/tailscale, or an equivalent mirror of that image.
|
||||
// To apply to ProxyGroups of type "kube-apiserver", this image must be
|
||||
// tailscale/k8s-proxy or a mirror of that image.
|
||||
//
|
||||
// For "tailscale/tailscale"-based proxies, specifying image name here will
|
||||
// override any proxy image values specified via the Kubernetes operator's
|
||||
// Helm chart values or PROXY_IMAGE env var in the operator Deployment.
|
||||
// For "tailscale/k8s-proxy"-based proxies, there is currently no way to
|
||||
// configure your own default, and this field is the only way to use a
|
||||
// custom image.
|
||||
//
|
||||
// https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#image
|
||||
// +optional
|
||||
Image string `json:"image,omitempty"`
|
||||
|
@@ -49,7 +49,7 @@ type ProxyGroupList struct {
|
||||
}
|
||||
|
||||
type ProxyGroupSpec struct {
|
||||
// Type of the ProxyGroup proxies. Supported types are egress and ingress.
|
||||
// Type of the ProxyGroup proxies. Supported types are egress, ingress, and kube-apiserver.
|
||||
// Type is immutable once a ProxyGroup is created.
|
||||
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="ProxyGroup type is immutable"
|
||||
Type ProxyGroupType `json:"type"`
|
||||
@@ -84,6 +84,11 @@ type ProxyGroupSpec struct {
|
||||
// configuration.
|
||||
// +optional
|
||||
ProxyClass string `json:"proxyClass,omitempty"`
|
||||
|
||||
// KubeAPIServer contains configuration specific to the kube-apiserver
|
||||
// ProxyGroup type. This field is only used when Type is set to "kube-apiserver".
|
||||
// +optional
|
||||
KubeAPIServer *KubeAPIServerConfig `json:"kubeAPIServer,omitempty"`
|
||||
}
|
||||
|
||||
type ProxyGroupStatus struct {
|
||||
@@ -122,14 +127,34 @@ type TailnetDevice struct {
|
||||
}
|
||||
|
||||
// +kubebuilder:validation:Type=string
|
||||
// +kubebuilder:validation:Enum=egress;ingress
|
||||
// +kubebuilder:validation:Enum=egress;ingress;kube-apiserver
|
||||
type ProxyGroupType string
|
||||
|
||||
const (
|
||||
ProxyGroupTypeEgress ProxyGroupType = "egress"
|
||||
ProxyGroupTypeIngress ProxyGroupType = "ingress"
|
||||
ProxyGroupTypeEgress ProxyGroupType = "egress"
|
||||
ProxyGroupTypeIngress ProxyGroupType = "ingress"
|
||||
ProxyGroupTypeKubernetesAPIServer ProxyGroupType = "kube-apiserver"
|
||||
)
|
||||
|
||||
// +kubebuilder:validation:Type=string
|
||||
// +kubebuilder:validation:Enum=auth;noauth
|
||||
type APIServerProxyMode string
|
||||
|
||||
const (
|
||||
APIServerProxyModeAuth APIServerProxyMode = "auth"
|
||||
APIServerProxyModeNoAuth APIServerProxyMode = "noauth"
|
||||
)
|
||||
|
||||
// +kubebuilder:validation:Type=string
|
||||
// +kubebuilder:validation:Pattern=`^[a-z0-9][a-z0-9-]{0,61}$`
|
||||
type HostnamePrefix string
|
||||
|
||||
// KubeAPIServerConfig contains configuration specific to the kube-apiserver ProxyGroup type.
|
||||
type KubeAPIServerConfig struct {
|
||||
// Mode to run the API server proxy in. Supported modes are auth and noauth.
|
||||
// In auth mode, requests from the tailnet proxied over to the Kubernetes
|
||||
// API server are additionally impersonated using the sender's tailnet identity.
|
||||
// If not specified, defaults to auth mode.
|
||||
// +optional
|
||||
Mode *APIServerProxyMode `json:"mode,omitempty"`
|
||||
}
|
||||
|
@@ -316,6 +316,26 @@ func (in *Env) DeepCopy() *Env {
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *KubeAPIServerConfig) DeepCopyInto(out *KubeAPIServerConfig) {
|
||||
*out = *in
|
||||
if in.Mode != nil {
|
||||
in, out := &in.Mode, &out.Mode
|
||||
*out = new(APIServerProxyMode)
|
||||
**out = **in
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeAPIServerConfig.
|
||||
func (in *KubeAPIServerConfig) DeepCopy() *KubeAPIServerConfig {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(KubeAPIServerConfig)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in Labels) DeepCopyInto(out *Labels) {
|
||||
{
|
||||
@@ -731,6 +751,11 @@ func (in *ProxyGroupSpec) DeepCopyInto(out *ProxyGroupSpec) {
|
||||
*out = new(int32)
|
||||
**out = **in
|
||||
}
|
||||
if in.KubeAPIServer != nil {
|
||||
in, out := &in.KubeAPIServer, &out.KubeAPIServer
|
||||
*out = new(KubeAPIServerConfig)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyGroupSpec.
|
||||
|
Reference in New Issue
Block a user