Skip to content

Commit

Permalink
Merge pull request #586 from village-way/release-0.4.0
Browse files Browse the repository at this point in the history
Cherry-Pick: ANP support TCP mode and bug fix
  • Loading branch information
duanmengkk authored May 23, 2024
2 parents a5c5eef + b2d3ba2 commit 3c08841
Show file tree
Hide file tree
Showing 15 changed files with 267 additions and 43 deletions.
11 changes: 6 additions & 5 deletions cmd/kubenest/operator/app/operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,12 @@ func run(ctx context.Context, opts *options.Options) error {
}

VirtualClusterInitController := controller.VirtualClusterInitController{
Client: mgr.GetClient(),
Config: mgr.GetConfig(),
EventRecorder: mgr.GetEventRecorderFor(constants.InitControllerName),
RootClientSet: hostKubeClient,
KosmosClient: kosmosClient,
Client: mgr.GetClient(),
Config: mgr.GetConfig(),
EventRecorder: mgr.GetEventRecorderFor(constants.InitControllerName),
RootClientSet: hostKubeClient,
KosmosClient: kosmosClient,
KubeNestOptions: &opts.KubeNestOptions,
}
if err = VirtualClusterInitController.SetupWithManager(mgr); err != nil {
return fmt.Errorf("error starting %s: %v", constants.InitControllerName, err)
Expand Down
2 changes: 2 additions & 0 deletions cmd/kubenest/operator/app/options/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ type KubernetesOptions struct {

type KubeNestOptions struct {
ForceDestroy bool
AnpMode string
}

func NewOptions() *Options {
Expand Down Expand Up @@ -53,4 +54,5 @@ func (o *Options) AddFlags(flags *pflag.FlagSet) {
flags.BoolVar(&o.AllowNodeOwnbyMulticluster, "multiowner", false, "Allow node own by multicluster or not.")
flags.BoolVar(&o.KosmosJoinController, "kosmos-join-controller", false, "Turn on or off kosmos-join-controller.")
flags.BoolVar(&o.KubeNestOptions.ForceDestroy, "kube-nest-force-destroy", false, "Force destroy the node.If it set true.If set to true, Kubernetes will not evict the existing nodes on the node when joining nodes to the tenant's control plane, but will instead force destroy.")
flags.StringVar(&o.KubeNestOptions.AnpMode, "kube-nest-anp-mode", "tcp", "kube-apiserver network proxy mode, must be set to tcp or uds. uds mode the replicas for apiserver should be one, and tcp for multi apiserver replicas.")
}
1 change: 1 addition & 0 deletions pkg/kubenest/constants/constant.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ const (
EtcdClientCertAndKeyName = "etcd-client"
FrontProxyCaCertAndKeyName = "front-proxy-ca"
FrontProxyClientCertAndKeyName = "front-proxy-client"
ProxyServerCertAndKeyName = "proxy-server"

//controlplane apiserver
ApiServer = "apiserver"
Expand Down
4 changes: 3 additions & 1 deletion pkg/kubenest/controller/virtualcluster_execute_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"k8s.io/klog/v2"
"sigs.k8s.io/controller-runtime/pkg/client"

ko "github.com/kosmos.io/kosmos/cmd/kubenest/operator/app/options"
"github.com/kosmos.io/kosmos/pkg/apis/kosmos/v1alpha1"
"github.com/kosmos.io/kosmos/pkg/kubenest"
"github.com/kosmos.io/kosmos/pkg/kubenest/constants"
Expand All @@ -21,12 +22,13 @@ type Executor struct {
config *rest.Config
}

func NewExecutor(virtualCluster *v1alpha1.VirtualCluster, c client.Client, config *rest.Config) (*Executor, error) {
func NewExecutor(virtualCluster *v1alpha1.VirtualCluster, c client.Client, config *rest.Config, kubeNestOptions *ko.KubeNestOptions) (*Executor, error) {
var phase *workflow.Phase

opts := []kubenest.InitOpt{
kubenest.NewInitOptWithVirtualCluster(virtualCluster),
kubenest.NewInitOptWithKubeconfig(config),
kubenest.NewInitOptWithKubeNestOptions(kubeNestOptions),
}
options := kubenest.NewPhaseInitOptions(opts...)
action := recognizeActionFor(virtualCluster)
Expand Down
20 changes: 11 additions & 9 deletions pkg/kubenest/controller/virtualcluster_init_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/controller-runtime/pkg/reconcile"

"github.com/kosmos.io/kosmos/cmd/kubenest/operator/app/options"
"github.com/kosmos.io/kosmos/pkg/apis/kosmos/v1alpha1"
"github.com/kosmos.io/kosmos/pkg/generated/clientset/versioned"
"github.com/kosmos.io/kosmos/pkg/kubenest/constants"
Expand All @@ -35,11 +36,12 @@ import (

type VirtualClusterInitController struct {
client.Client
Config *rest.Config
EventRecorder record.EventRecorder
RootClientSet kubernetes.Interface
KosmosClient versioned.Interface
lock sync.Mutex
Config *rest.Config
EventRecorder record.EventRecorder
RootClientSet kubernetes.Interface
KosmosClient versioned.Interface
lock sync.Mutex
KubeNestOptions *options.KubeNestOptions
}

type NodePool struct {
Expand Down Expand Up @@ -118,7 +120,7 @@ func (c *VirtualClusterInitController) Reconcile(ctx context.Context, request re
return reconcile.Result{RequeueAfter: RequeueTime}, nil
}
updatedCluster := originalCluster.DeepCopy()
err = c.createVirtualCluster(updatedCluster)
err = c.createVirtualCluster(updatedCluster, c.KubeNestOptions)
if err != nil {
klog.Errorf("Failed to create virtualcluster %s. err: %s", updatedCluster.Name, err.Error())
updatedCluster.Status.Reason = err.Error()
Expand Down Expand Up @@ -230,7 +232,7 @@ func (c *VirtualClusterInitController) removeFinalizer(virtualCluster *v1alpha1.
}

// createVirtualCluster assign work nodes, create control plane and create compoennts from manifests
func (c *VirtualClusterInitController) createVirtualCluster(virtualCluster *v1alpha1.VirtualCluster) error {
func (c *VirtualClusterInitController) createVirtualCluster(virtualCluster *v1alpha1.VirtualCluster, kubeNestOptions *options.KubeNestOptions) error {
klog.V(2).Infof("Reconciling virtual cluster", "name", virtualCluster.Name)

//Assign host port
Expand All @@ -239,7 +241,7 @@ func (c *VirtualClusterInitController) createVirtualCluster(virtualCluster *v1al
return errors.Wrap(err, "Error in assign host port!")
}

executer, err := NewExecutor(virtualCluster, c.Client, c.Config)
executer, err := NewExecutor(virtualCluster, c.Client, c.Config, kubeNestOptions)
if err != nil {
return err
}
Expand Down Expand Up @@ -267,7 +269,7 @@ func (c *VirtualClusterInitController) createVirtualCluster(virtualCluster *v1al

func (c *VirtualClusterInitController) destroyVirtualCluster(virtualCluster *v1alpha1.VirtualCluster) error {
klog.V(2).Infof("Destroying virtual cluster %s", virtualCluster.Name)
execute, err := NewExecutor(virtualCluster, c.Client, c.Config)
execute, err := NewExecutor(virtualCluster, c.Client, c.Config, c.KubeNestOptions)
if err != nil {
return err
}
Expand Down
27 changes: 23 additions & 4 deletions pkg/kubenest/controlplane/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import (
"github.com/kosmos.io/kosmos/pkg/kubenest/util"
)

func EnsureVirtualClusterService(client clientset.Interface, name, namespace string, port int32) error {
if err := createServerService(client, name, namespace, port); err != nil {
func EnsureVirtualClusterService(client clientset.Interface, name, namespace string, portMap map[string]int32) error {
if err := createServerService(client, name, namespace, portMap); err != nil {
return fmt.Errorf("failed to create virtual cluster apiserver-service, err: %w", err)
}
return nil
Expand All @@ -46,19 +46,30 @@ func DeleteVirtualClusterService(client clientset.Interface, name, namespace str
return nil
}

func createServerService(client clientset.Interface, name, namespace string, port int32) error {
func createServerService(client clientset.Interface, name, namespace string, portMap map[string]int32) error {
apiserverServiceBytes, err := util.ParseTemplate(apiserver.ApiserverService, struct {
ServiceName, Namespace, ServiceType string
ServicePort int32
}{
ServiceName: fmt.Sprintf("%s-%s", name, "apiserver"),
Namespace: namespace,
ServiceType: constants.ApiServerServiceType,
ServicePort: port,
ServicePort: portMap[constants.ApiServerPortKey],
})
if err != nil {
return fmt.Errorf("error when parsing virtualClusterApiserver serive template: %w", err)
}
anpServiceBytes, err := util.ParseTemplate(apiserver.ApiserverAnpService, struct {
ServiceName, Namespace string
ProxyServerPort int32
}{
ServiceName: fmt.Sprintf("%s-%s", name, "konnectivity-server"),
Namespace: namespace,
ProxyServerPort: portMap[constants.ApiServerNetworkProxyServerPortKey],
})
if err != nil {
return fmt.Errorf("error when parsing virtualClusterApiserver anp service template: %w", err)
}

apiserverService := &corev1.Service{}
if err := yaml.Unmarshal([]byte(apiserverServiceBytes), apiserverService); err != nil {
Expand All @@ -68,6 +79,14 @@ func createServerService(client clientset.Interface, name, namespace string, por
return fmt.Errorf("err when creating virtual cluster apiserver service for %s, err: %w", apiserverService.Name, err)
}

anpService := &corev1.Service{}
if err := yaml.Unmarshal([]byte(anpServiceBytes), anpService); err != nil {
return fmt.Errorf("error when decoding virtual cluster anp service: %w", err)
}
if err := createOrUpdateService(client, anpService); err != nil {
return fmt.Errorf("err when creating virtual cluster anp service for %s, err: %w", anpService.Name, err)
}

etcdServicePeerBytes, err := util.ParseTemplate(etcd.EtcdPeerService, struct {
ServiceName, Namespace string
EtcdListenClientPort, EtcdListenPeerPort int32
Expand Down
14 changes: 14 additions & 0 deletions pkg/kubenest/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
clientset "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"

ko "github.com/kosmos.io/kosmos/cmd/kubenest/operator/app/options"
"github.com/kosmos.io/kosmos/pkg/apis/kosmos/v1alpha1"
"github.com/kosmos.io/kosmos/pkg/generated/clientset/versioned"
"github.com/kosmos.io/kosmos/pkg/kubenest/tasks"
Expand All @@ -36,6 +37,7 @@ type initData struct {
externalIP string
hostPort int32
hostPortMap map[string]int32
kubeNestOptions *ko.KubeNestOptions
}

type InitOptions struct {
Expand All @@ -45,6 +47,7 @@ type InitOptions struct {
virtualClusterVersion string
virtualClusterDataDir string
virtualCluster *v1alpha1.VirtualCluster
KubeNestOptions *ko.KubeNestOptions
}

func NewInitPhase(opts *InitOptions) *workflow.Phase {
Expand Down Expand Up @@ -122,6 +125,12 @@ func NewInitOptWithKubeconfig(config *rest.Config) InitOpt {
}
}

func NewInitOptWithKubeNestOptions(options *ko.KubeNestOptions) InitOpt {
return func(o *InitOptions) {
o.KubeNestOptions = options
}
}

func newRunData(opt *InitOptions) (*initData, error) {
if err := opt.Validate(); err != nil {
return nil, err
Expand Down Expand Up @@ -174,6 +183,7 @@ func newRunData(opt *InitOptions) (*initData, error) {
externalIP: opt.virtualCluster.Spec.ExternalIP,
hostPort: opt.virtualCluster.Status.Port,
hostPortMap: opt.virtualCluster.Status.PortMap,
kubeNestOptions: opt.KubeNestOptions,
}, nil
}

Expand Down Expand Up @@ -244,3 +254,7 @@ func (i initData) HostPortMap() map[string]int32 {
func (i initData) DynamicClient() *dynamic.DynamicClient {
return i.dynamicClient
}

func (i initData) KubeNestOpt() *ko.KubeNestOptions {
return i.kubeNestOptions
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ spec:
spec:
automountServiceAccountToken: false
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
Expand Down Expand Up @@ -150,6 +151,7 @@ spec:
spec:
automountServiceAccountToken: false
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
Expand Down Expand Up @@ -265,19 +267,27 @@ spec:
runAsUser: 0
command: [ "/proxy-server"]
args: [
"--log-file=/var/log/konnectivity-server.log",
"--log-file=/var/log/{{ .Namespace }}/{{ .Name }}/konnectivity-server.log",
"--logtostderr=true",
"--log-file-max-size=0",
"--uds-name=/etc/kubernetes/konnectivity-server/{{ .Namespace }}/{{ .Name }}/konnectivity-server.socket",
"--delete-existing-uds-file",
"--cluster-cert=/etc/virtualcluster/pki/apiserver.crt",
"--cluster-key=/etc/virtualcluster/pki/apiserver.key",
{{ if eq .AnpMode "uds" }}
"--server-port=0",
"--mode=grpc",
"--uds-name=/etc/kubernetes/konnectivity-server/{{ .Namespace }}/{{ .Name }}/konnectivity-server.socket",
"--delete-existing-uds-file",
{{ else }}
"--server-port={{ .ServerPort }}",
"--mode=http-connect",
"--server-cert=/etc/virtualcluster/pki/proxy-server.crt",
"--server-ca-cert=/etc/virtualcluster/pki/ca.crt",
"--server-key=/etc/virtualcluster/pki/proxy-server.key",
{{ end }}
"--agent-port={{ .AgentPort }}",
"--health-port={{ .HealthPort }}",
"--admin-port={{ .AdminPort }}",
"--keepalive-time=1h",
"--mode=grpc",
"--agent-namespace=kube-system",
"--agent-service-account=konnectivity-agent",
"--kubeconfig=/etc/apiserver/kubeconfig",
Expand Down Expand Up @@ -309,7 +319,7 @@ spec:
name: apiserver-cert
readOnly: true
- name: varlogkonnectivityserver
mountPath: /var/log/konnectivity-server.log
mountPath: /var/log/{{ .Namespace }}/{{ .Name }}
readOnly: false
- name: konnectivity-home
mountPath: /etc/kubernetes/konnectivity-server/{{ .Namespace }}/{{ .Name }}
Expand All @@ -324,8 +334,8 @@ spec:
secretName: {{ .KubeconfigSecret }}
- name: varlogkonnectivityserver
hostPath:
path: /var/log/{{ .Namespace }}/{{ .Name }}/konnectivity-server.log
type: FileOrCreate
path: /var/log/{{ .Namespace }}/{{ .Name }}
type: DirectoryOrCreate
- name: konnectivity-home
hostPath:
path: /etc/kubernetes/konnectivity-server/{{ .Namespace }}/{{ .Name }}
Expand Down Expand Up @@ -413,7 +423,11 @@ spec:
"--sync-interval-cap=30s",
"--probe-interval=5s",
"--service-account-token-path=/var/run/secrets/tokens/konnectivity-agent-token",
"--agent-identifiers=ipv4=$(HOST_IP)"
"--agent-identifiers=ipv4=$(HOST_IP)",
{{ if ne .AnpMode "uds" }}
"--agent-cert=/etc/virtualcluster/pki/apiserver.crt",
"--agent-key=/etc/virtualcluster/pki/apiserver.key",
{{ end }}
]
env:
- name: POD_NAME
Expand Down Expand Up @@ -443,10 +457,15 @@ spec:
initialDelaySeconds: 15
timeoutSeconds: 15
volumeMounts:
- name: agent-cert
mountPath: /etc/virtualcluster/pki
- mountPath: /var/run/secrets/tokens
name: konnectivity-agent-token
serviceAccountName: konnectivity-agent
volumes:
- name: agent-cert
secret:
secretName: {{ .AgentCertName }}
- name: konnectivity-agent-token
projected:
sources:
Expand Down
19 changes: 19 additions & 0 deletions pkg/kubenest/manifest/controlplane/apiserver/mainfests_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,24 @@ spec:
selector:
virtualCluster-app: apiserver
type: {{ .ServiceType }}
`
ApiserverAnpService = `
apiVersion: v1
kind: Service
metadata:
labels:
virtualCluster-app: apiserver
app.kubernetes.io/managed-by: virtual-cluster-controller
name: {{ .ServiceName }}
namespace: {{ .Namespace }}
spec:
ports:
- name: proxy-server
port: {{ .ProxyServerPort }}
protocol: TCP
targetPort: {{ .ProxyServerPort }}
selector:
virtualCluster-app: apiserver
type: ClusterIP
`
)
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,19 @@ data:
egressSelections:
- name: cluster
connection:
proxyProtocol: GRPC
proxyProtocol: {{ if eq .AnpMode "uds" }}GRPC{{ else }}HTTPConnect{{ end }}
transport:
{{ if eq .AnpMode "uds" }}
uds:
udsName: /etc/kubernetes/konnectivity-server/{{ .Namespace }}/{{ .Name }}/konnectivity-server.socket
{{ else }}
tcp:
url: https://{{ .SvcName }}:{{ .ProxyServerPort }}
tlsConfig:
caBundle: /etc/virtualcluster/pki/ca.crt
clientKey: /etc/virtualcluster/pki/proxy-server.key
clientCert: /etc/virtualcluster/pki/proxy-server.crt
{{ end }}
- name: master
connection:
proxyProtocol: Direct
Expand Down
Loading

0 comments on commit 3c08841

Please sign in to comment.