diff --git a/go.mod b/go.mod
index 7155f5ebb8d3d85c99b0c46672124c96e1381411..f3bec55eb4c6bf2aaa7fef876d7a866170ba9cc7 100644
--- a/go.mod
+++ b/go.mod
@@ -107,5 +107,5 @@ require (
 
 replace (
 	github.com/go-logr/logr => github.com/go-logr/logr v0.4.0
-	k8s.io/klog/v2 => k8s.io/klog/v2 v2.9.0
+	k8s.io/klog/v2 => k8s.io/klog/v2 v2.10.0
 )
diff --git a/go.sum b/go.sum
index aecc03402f378a4cb627eab186cc3a8078c20b3e..2b1f56e9d3624e5f76d391ce1316950cac917174 100644
--- a/go.sum
+++ b/go.sum
@@ -1272,8 +1272,8 @@ k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUc
 k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
 k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
-k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM=
-k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
+k8s.io/klog/v2 v2.10.0 h1:R2HDMDJsHVTHA2n4RjwbeYXdOcBymXdX/JRb1v0VGhE=
+k8s.io/klog/v2 v2.10.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
 k8s.io/kube-aggregator v0.18.0-beta.2/go.mod h1:O3Td9mheraINbLHH4pzoFP2gRzG0Wk1COqzdSL4rBPk=
 k8s.io/kube-aggregator v0.22.0-rc.0/go.mod h1:g0xtiBSsbMKvewN7xR/Icib4TrHxtvrJcHtYvFsgw7k=
 k8s.io/kube-aggregator v0.23.0 h1:IjY8CfGHH9WUvJXIaAsAxTzHDsaLVeaEqjkvo6MLMD0=
diff --git a/install/0000_30_machine-api-operator_00_credentials-request.yaml b/install/0000_30_machine-api-operator_00_credentials-request.yaml
index 37dedabf15447ec610d48c2e0105ecd68cad5387..10b36523811e7850f7cea625cc346ba83c235385 100644
--- a/install/0000_30_machine-api-operator_00_credentials-request.yaml
+++ b/install/0000_30_machine-api-operator_00_credentials-request.yaml
@@ -214,3 +214,33 @@ spec:
   secretRef:
     namespace: openshift-machine-api
     name: powervs-credentials
+---
+apiVersion: cloudcredential.openshift.io/v1
+kind: CredentialsRequest
+metadata:
+  name: openshift-machine-api-alibabacloud
+  namespace: openshift-cloud-credential-operator
+spec:
+  providerSpec:
+    apiVersion: cloudcredential.openshift.io/v1
+    kind: AlibabaCloudProviderSpec
+    statementEntries:
+      - action:
+        - ecs:DeleteInstances
+        - ecs:DescribeImages
+        - ecs:DescribeInstances
+        - ecs:DescribeSecurityGroups
+        - ecs:RunInstances
+        - ecs:StopInstances
+        - ecs:TagResources
+        effect: Allow
+        resource: '*'
+      - action:
+        - vpc:DescribeVpcs
+        - vpc:DescribeVSwitches
+        - ram:PassRole
+        resource: '*'
+        effect: Allow
+  secretRef:
+    namespace: openshift-machine-api
+    name: alibabacloud-credentials
diff --git a/install/0000_30_machine-api-operator_01_images.configmap.yaml b/install/0000_30_machine-api-operator_01_images.configmap.yaml
index 9de46160fc704acbfff5c90de57ff1a5ff39488d..70351cff61565ab838eb4521dfbe2b42e2d5305a 100644
--- a/install/0000_30_machine-api-operator_01_images.configmap.yaml
+++ b/install/0000_30_machine-api-operator_01_images.configmap.yaml
@@ -13,6 +13,7 @@ data:
       "machineAPIOperator": "registry.svc.ci.openshift.org/openshift:machine-api-operator",
       "kubeRBACProxy": "registry.svc.ci.openshift.org/openshift:kube-rbac-proxy",
       "clusterAPIControllerAWS": "registry.svc.ci.openshift.org/openshift:aws-machine-controllers",
+      "clusterAPIControllerAlibaba": "registry.svc.ci.openshift.org/openshift:alibaba-machine-controllers",
       "clusterAPIControllerOpenStack": "registry.svc.ci.openshift.org/openshift:openstack-machine-controllers",
       "clusterAPIControllerMAPO": "quay.io/shiftstack/machine-api-provider-openstack:latest",
       "clusterAPIControllerLibvirt": "registry.svc.ci.openshift.org/openshift:libvirt-machine-controllers",
diff --git a/install/image-references b/install/image-references
index d7ddaeead819f9f4dea3609a059b370b8fabf329..76913495bc1725b67b9d34fd4cf2da6d3e477526 100644
--- a/install/image-references
+++ b/install/image-references
@@ -50,3 +50,7 @@ spec:
     from:
       kind: DockerImage
       name: registry.svc.ci.openshift.org/openshift:ovirt-machine-controllers
+  - name: alibaba-machine-controllers
+    from:
+      kind: DockerImage
+      name: registry.svc.ci.openshift.org/openshift:alibaba-machine-controllers
diff --git a/pkg/operator/config.go b/pkg/operator/config.go
index 86177e8ae9c33a5ec298a7387f5d78f6a6b17565..53fe19d083fb0108c8c7ce8ab80964a00e2982bb 100644
--- a/pkg/operator/config.go
+++ b/pkg/operator/config.go
@@ -39,6 +39,7 @@ type Controllers struct {
 // Images allows build systems to inject images for MAO components
 type Images struct {
 	MachineAPIOperator            string `json:"machineAPIOperator"`
+	ClusterAPIControllerAlibaba   string `json:"clusterAPIControllerAlibaba"`
 	ClusterAPIControllerAWS       string `json:"clusterAPIControllerAWS"`
 	ClusterAPIControllerOpenStack string `json:"clusterAPIControllerOpenStack"`
 	MachineAPIControllerOpenStack string `json:"clusterAPIControllerMAPO"`
@@ -100,6 +101,8 @@ func getProviderControllerFromImages(platform configv1.PlatformType, featureGate
 	switch platform {
 	case configv1.AWSPlatformType:
 		return images.ClusterAPIControllerAWS, nil
+	case configv1.AlibabaCloudPlatformType:
+		return images.ClusterAPIControllerAlibaba, nil
 	case configv1.LibvirtPlatformType:
 		return images.ClusterAPIControllerLibvirt, nil
 	case configv1.OpenStackPlatformType:
@@ -144,6 +147,8 @@ func getTerminationHandlerFromImages(platform configv1.PlatformType, images Imag
 		return images.ClusterAPIControllerGCP, nil
 	case configv1.AzurePlatformType:
 		return images.ClusterAPIControllerAzure, nil
+	case configv1.AlibabaCloudPlatformType:
+		return images.ClusterAPIControllerAlibaba, nil
 	default:
 		return clusterAPIControllerNoOp, nil
 	}
diff --git a/pkg/operator/config_test.go b/pkg/operator/config_test.go
index 320bb02c36d6155822afee4b1cd4fbf293b863b3..fa38db91de77e71f18894efa7ecb5338cd2d51a8 100644
--- a/pkg/operator/config_test.go
+++ b/pkg/operator/config_test.go
@@ -9,6 +9,7 @@ import (
 var (
 	imagesJSONFile                  = "fixtures/images.json"
 	expectedAWSImage                = "docker.io/openshift/origin-aws-machine-controllers:v4.0.0"
+	expectedAlibabaImage            = "docker.io/openshift/origin-alibaba-machine-controllers:v4.0.0"
 	expectedLibvirtImage            = "docker.io/openshift/origin-libvirt-machine-controllers:v4.0.0"
 	expectedOpenstackImage          = "docker.io/openshift/origin-openstack-machine-controllers:v4.0.0"
 	expectedMAPOImage               = "quay.io/shiftstack/machine-api-provider-openstack:latest"
@@ -35,6 +36,15 @@ func TestGetProviderFromInfrastructure(t *testing.T) {
 			},
 		},
 		expected: configv1.AWSPlatformType,
+	}, {
+		infra: &configv1.Infrastructure{
+			Status: configv1.InfrastructureStatus{
+				PlatformStatus: &configv1.PlatformStatus{
+					Type: configv1.AlibabaCloudPlatformType,
+				},
+			},
+		},
+		expected: configv1.AlibabaCloudPlatformType,
 	}, {
 		infra: &configv1.Infrastructure{
 			Status: configv1.InfrastructureStatus{
@@ -189,10 +199,15 @@ func TestGetProviderControllerFromImages(t *testing.T) {
 		provider      configv1.PlatformType
 		featureGate   configv1.FeatureGate
 		expectedImage string
-	}{{
-		provider:      configv1.AWSPlatformType,
-		expectedImage: expectedAWSImage,
-	},
+	}{
+		{
+			provider:      configv1.AWSPlatformType,
+			expectedImage: expectedAWSImage,
+		},
+		{
+			provider:      configv1.AlibabaCloudPlatformType,
+			expectedImage: expectedAlibabaImage,
+		},
 		{
 			provider:      configv1.LibvirtPlatformType,
 			expectedImage: expectedLibvirtImage,
@@ -292,10 +307,15 @@ func TestGetTerminationHandlerFromImages(t *testing.T) {
 	tests := []struct {
 		provider      configv1.PlatformType
 		expectedImage string
-	}{{
-		provider:      configv1.AWSPlatformType,
-		expectedImage: expectedAWSImage,
-	},
+	}{
+		{
+			provider:      configv1.AWSPlatformType,
+			expectedImage: expectedAWSImage,
+		},
+		{
+			provider:      configv1.AlibabaCloudPlatformType,
+			expectedImage: expectedAlibabaImage,
+		},
 		{
 			provider:      configv1.LibvirtPlatformType,
 			expectedImage: clusterAPIControllerNoOp,
diff --git a/pkg/operator/fixtures/images.json b/pkg/operator/fixtures/images.json
index 927f4f3fadfc9991c090597ca7a969f40ad9cc09..9c034d96c95afa3e1965720591ee3325da9d9919 100644
--- a/pkg/operator/fixtures/images.json
+++ b/pkg/operator/fixtures/images.json
@@ -1,5 +1,6 @@
 {
   "clusterAPIControllerAWS": "docker.io/openshift/origin-aws-machine-controllers:v4.0.0",
+  "clusterAPIControllerAlibaba": "docker.io/openshift/origin-alibaba-machine-controllers:v4.0.0",
   "clusterAPIControllerOpenStack": "docker.io/openshift/origin-openstack-machine-controllers:v4.0.0",
   "clusterAPIControllerMAPO": "quay.io/shiftstack/machine-api-provider-openstack:latest",
   "clusterAPIControllerLibvirt": "docker.io/openshift/origin-libvirt-machine-controllers:v4.0.0",
diff --git a/pkg/operator/operator_test.go b/pkg/operator/operator_test.go
index df120c385111deda9a97ce1768e2ef0549b790eb..57025481bb49aebae5a9e4efbf00da650d08d588 100644
--- a/pkg/operator/operator_test.go
+++ b/pkg/operator/operator_test.go
@@ -323,6 +323,24 @@ func TestMAOConfigFromInfrastructure(t *testing.T) {
 				},
 			},
 		},
+		{
+			name:     string(openshiftv1.AlibabaCloudPlatformType),
+			platform: openshiftv1.AlibabaCloudPlatformType,
+			infra:    infra,
+			proxy:    proxy,
+			expectedConfig: &OperatorConfig{
+				TargetNamespace: targetNamespace,
+				Proxy:           proxy,
+				Controllers: Controllers{
+					Provider:           images.ClusterAPIControllerAlibaba,
+					MachineSet:         images.MachineAPIOperator,
+					NodeLink:           images.MachineAPIOperator,
+					MachineHealthCheck: images.MachineAPIOperator,
+					TerminationHandler: images.ClusterAPIControllerAlibaba,
+					KubeRBACProxy:      images.KubeRBACProxy,
+				},
+			},
+		},
 		{
 			name:     string(openshiftv1.LibvirtPlatformType),
 			platform: openshiftv1.LibvirtPlatformType,
diff --git a/vendor/k8s.io/klog/v2/OWNERS b/vendor/k8s.io/klog/v2/OWNERS
index 380e514f2807b6d3d7c7531ea47a1d3988b8b3e0..f689c16416f9efaaad710e58a8425c176cdbb8a9 100644
--- a/vendor/k8s.io/klog/v2/OWNERS
+++ b/vendor/k8s.io/klog/v2/OWNERS
@@ -15,5 +15,4 @@ approvers:
   - tallclair
   - piosz
   - brancz
-  - DirectXMan12
   - lavalamp
diff --git a/vendor/k8s.io/klog/v2/klog.go b/vendor/k8s.io/klog/v2/klog.go
index 1e187f76354b66413c6320cebc11fa3d2acd8542..d24087def664053ad02859dcf0cc8dbc40f72f7c 100644
--- a/vendor/k8s.io/klog/v2/klog.go
+++ b/vendor/k8s.io/klog/v2/klog.go
@@ -1603,3 +1603,20 @@ func KRef(namespace, name string) ObjectRef {
 		Namespace: namespace,
 	}
 }
+
+// KObjs returns slice of ObjectRef from an slice of ObjectMeta
+func KObjs(arg interface{}) []ObjectRef {
+	s := reflect.ValueOf(arg)
+	if s.Kind() != reflect.Slice {
+		return nil
+	}
+	objectRefs := make([]ObjectRef, 0, s.Len())
+	for i := 0; i < s.Len(); i++ {
+		if v, ok := s.Index(i).Interface().(KMetadata); ok {
+			objectRefs = append(objectRefs, KObj(v))
+		} else {
+			return nil
+		}
+	}
+	return objectRefs
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index e3486fe3d6117877e30c84c803bbb62bce75b923..7822bc1c797c52f1cabd2d2c3fbdf7d02f2a85f5 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -912,7 +912,7 @@ k8s.io/component-base/config/v1alpha1
 k8s.io/component-base/metrics
 k8s.io/component-base/metrics/legacyregistry
 k8s.io/component-base/version
-# k8s.io/klog/v2 v2.30.0 => k8s.io/klog/v2 v2.9.0
+# k8s.io/klog/v2 v2.30.0 => k8s.io/klog/v2 v2.10.0
 ## explicit; go 1.13
 k8s.io/klog/v2
 k8s.io/klog/v2/klogr
@@ -1102,4 +1102,4 @@ sigs.k8s.io/structured-merge-diff/v4/value
 ## explicit; go 1.12
 sigs.k8s.io/yaml
 # github.com/go-logr/logr => github.com/go-logr/logr v0.4.0
-# k8s.io/klog/v2 => k8s.io/klog/v2 v2.9.0
+# k8s.io/klog/v2 => k8s.io/klog/v2 v2.10.0