Alibaba Cloud has a managed Kubernetes service called Alibaba Cloud Container Service. As with other distributions of Kubernetes there are some quirks to use it. I have documented the issues I’ve found when trying to run Jenkins X there.
Alibaba Cloud has several options to run Kubernetes:
- Dedicated Kubernetes: You must create three Master nodes and one or multiple Worker nodes for the cluster
- Managed Kubernetes: You only need to create Worker nodes for the cluster, and Alibaba Cloud Container Service for Kubernetes creates and manages Master nodes for the cluster
- Multi-AZ Kubernetes
- Serverless Kubernetes (beta): You are charged for the resources used by container instances. The amount of used resources is measured according to resource usage duration (in seconds).
You can run in multiple regions across the globe, however to run in the mainland China regions you need a Chinese id or business id. When running there you also have to face the issues of running behind The Great Firewall of China, that is currently blocking some Google services, such as Google Container Registry access, where some Docker images are hosted. DockerHub or Google Storage Service are not blocked.
Creating a Kubernetes Cluster
Alibaba requires several things in order to create a Kubernetes cluster, so it is easier to do it through the web UI the first time.
The following services need to be activated: Container Service, Resource Orchestration Service (ROS), RAM, and Auto Scaling service, and created the Container Service roles.
If we want to use the command line we can install the aliyun
cli. I have added all the steps needed below in case you want to use it.
brew install aliyun-cli
aliyun configure
REGION=ap-southeast-1
The clusters need to be created in a VPC, so that needs to be created with VSwitches for each zone to be used.
aliyun vpc CreateVpc \
--VpcName jx \
--Description "Jenkins X" \
--RegionId ${REGION} \
--CidrBlock 172.16.0.0/12
{
"ResourceGroupId": "rg-acfmv2nomuaaaaa",
"RequestId": "2E795E99-AD73-4EA7-8BF5-F6F391000000",
"RouteTableId": "vtb-t4nesimu804j33p4aaaaa",
"VRouterId": "vrt-t4n2w07mdra52kakaaaaa",
"VpcId": "vpc-t4nszyte14vie746aaaaa"
}
VPC=vpc-t4nszyte14vie746aaaaa
aliyun vpc CreateVSwitch \
--VSwitchName jx \
--VpcId ${VPC} \
--RegionId ${REGION} \
--ZoneId ${REGION}a \
--Description "Jenkins X" \
--CidrBlock 172.16.0.0/24
{
"RequestId": "89D9AB1F-B4AB-4B4B-8CAA-F68F84417502",
"VSwitchId": "vsw-t4n7uxycbwgtg14maaaaa"
}
VSWITCH=vsw-t4n7uxycbwgtg14maaaaa
Next, a keypair (or password) is needed for the cluster instances.
aliyun ecs ImportKeyPair \
--KeyPairName jx \
--RegionId ${REGION} \
--PublicKeyBody "$(cat ~/.ssh/id_rsa.pub)"
The last step is to create the cluster using the just created VPC, VSwitch and Keypair. It’s important to select the option Expose API Server with EIP (public_slb
in the API json) to be able to connect to the API from the internet.
echo << EOF > cluster.json
{
"name": "jx-rocks",
"cluster_type": "ManagedKubernetes",
"disable_rollback": true,
"timeout_mins": 60,
"region_id": "${REGION}",
"zoneid": "${REGION}a",
"snat_entry": true,
"cloud_monitor_flags": false,
"public_slb": true,
"worker_instance_type": "ecs.c4.xlarge",
"num_of_nodes": 3,
"worker_system_disk_category": "cloud_efficiency",
"worker_system_disk_size": 120,
"worker_instance_charge_type": "PostPaid",
"vpcid": "${VPC}",
"vswitchid": "${VSWITCH}",
"container_cidr": "172.20.0.0/16",
"service_cidr": "172.21.0.0/20",
"key_pair": "jx"
}
EOF
aliyun cs POST /clusters \
--header "Content-Type=application/json" \
--body "$(cat create.json)"
{
"cluster_id": "cb643152f97ae4e44980f6199f298f223",
"request_id": "0C1E16F8-6A9E-4726-AF6E-A8F37CDDC50C",
"task_id": "T-5cd93cf5b8ff804bb40000e1",
"instanceId": "cb643152f97ae4e44980f6199f298f223"
}
CLUSTER=cb643152f97ae4e44980f6199f298f223
We can now download kubectl
configuration with
aliyun cs GET /k8s/${CLUSTER}/user_config | jq -r .config > ~/.kube/config-alibaba
export KUBECONFIG=$KUBECONFIG:~/.kube/config-alibaba
Another detail before being able to install applications that use PersistentVolumeClaims
is to configure a default storage class. There are several volume options that can be listed with kubectl get storageclass
.
NAME PROVISIONER AGE
alicloud-disk-available alicloud/disk 44h
alicloud-disk-common alicloud/disk 44h
alicloud-disk-efficiency alicloud/disk 44h
alicloud-disk-ssd alicloud/disk 44h
Each of them matches the following cloud disks:
- alicloud-disk-common: basic cloud disk (minimum size 5GiB). Only available in some zones (us-west-1a, cn-beijing-b,…)
- alicloud-disk-efficiency: high-efficiency cloud disk, ultra disk (minimum size 20GiB).
- alicloud-disk-ssd: SSD disk (minimum size 20GiB).
- alicloud-disk-available: provides highly available options, first attempts to create a high-efficiency cloud disk. If the corresponding AZ’s efficient cloud disk resources are sold out, tries to create an SSD disk. If the SSD is sold out, tries to create a common cloud disk.
To set SSDs as the default:
kubectl patch storageclass alicloud-disk-ssd \
-p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class":"true"}}}'
NOTE: Alibaba cloud disks must be more than 5GiB (basic) or 20GiB (SSD and Ultra)) so we will need to configure any service that is deployed with PVCs to have that size as a minimum or the PersistentVolume
provision will fail.
You can continue reading about installing Jenkins X on Alibaba Cloud as an example.