diff --git a/stratio-docs/HOW_TO_DOC.md b/stratio-docs/HOW_TO_DOC.md new file mode 100644 index 0000000000..76a6c7d516 --- /dev/null +++ b/stratio-docs/HOW_TO_DOC.md @@ -0,0 +1,9 @@ +This is the client documentation, in opposition as the internal documentation present in the README.md + +* This documentation must be written in *Spanish*, the translation into an English version will be done by the Documentation team +* When adding doc in *Spanish* file must be duplicated in the *en* folder with the header: _TO BE TRANSLATED_ +* The file names must be in english (as the filenames are used for generating links for both ES and EN versions) +* When updating the docs a different PR must be opened, and the tag doc added to it. It will be reviewed by the Documentation team. +* You must write your documentation under *Asciidoc* https://asciidoc-py.github.io/index.html +* File `/antor-docs/es/antora.yml` must contain a version field matching the Version of cloud-provisioner + diff --git a/stratio-docs/en/antora.yml b/stratio-docs/en/antora.yml new file mode 100644 index 0000000000..a3181424b2 --- /dev/null +++ b/stratio-docs/en/antora.yml @@ -0,0 +1,6 @@ +name: cloud-provisioner +title: Stratio Cloud Provisioner +version: '0.2' +nav: +- modules/ROOT/nav.adoc +start_page: introduction.adoc diff --git a/stratio-docs/en/modules/ROOT/assets/attachments/example-eks-md.yaml b/stratio-docs/en/modules/ROOT/assets/attachments/example-eks-md.yaml new file mode 100644 index 0000000000..dc181dc310 --- /dev/null +++ b/stratio-docs/en/modules/ROOT/assets/attachments/example-eks-md.yaml @@ -0,0 +1,73 @@ +--- +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachineDeployment +metadata: + annotations: + cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: "3" + cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: "1" + labels: + cluster.x-k8s.io/cluster-name: example + name: example-medium + namespace: cluster-example +spec: + clusterName: example + minReadySeconds: 0 + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 1 + selector: + matchLabels: + cluster.x-k8s.io/cluster-name: example + cluster.x-k8s.io/deployment-name: example-medium + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + labels: + cluster.x-k8s.io/cluster-name: example + cluster.x-k8s.io/deployment-name: example-medium + spec: + bootstrap: + configRef: + apiVersion: bootstrap.cluster.x-k8s.io/v1beta2 + kind: EKSConfigTemplate + name: example-medium + namespace: cluster-example + clusterName: example + failureDomain: eu-west-1c + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + kind: AWSMachineTemplate + name: example-medium + namespace: cluster-example + version: v1.24.0 +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +kind: AWSMachineTemplate +metadata: + name: example-medium + namespace: cluster-example +spec: + template: + metadata: {} + spec: + ami: {} + cloudInit: {} + iamInstanceProfile: nodes.cluster-api-provider-aws.sigs.k8s.io + instanceType: t3.medium + sshKeyName: null +--- +apiVersion: bootstrap.cluster.x-k8s.io/v1beta2 +kind: EKSConfigTemplate +metadata: + name: example-medium + namespace: cluster-example +spec: + template: + spec: + kubeletExtraArgs: + node-labels: dynamic=true, +--- diff --git a/stratio-docs/en/modules/ROOT/assets/attachments/example-gcp-md.yaml b/stratio-docs/en/modules/ROOT/assets/attachments/example-gcp-md.yaml new file mode 100644 index 0000000000..0ea6786390 --- /dev/null +++ b/stratio-docs/en/modules/ROOT/assets/attachments/example-gcp-md.yaml @@ -0,0 +1,62 @@ +--- +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachineDeployment +metadata: + name: example-standard + namespace: cluster-example +spec: + clusterName: example + replicas: 3 + selector: + matchLabels: null + template: + spec: + bootstrap: + configRef: + apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 + kind: KubeadmConfigTemplate + name: example-standard + clusterName: example + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: GCPMachineTemplate + name: example-standard + version: 1.24.11 +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: GCPMachineTemplate +metadata: + name: example-standard + namespace: cluster-example +spec: + template: + spec: + image: projects/clusterapi-369611/global/images/cluster-api-ubuntu-2004-v1-24-11-1670424551 + instanceType: n1-standard-2 +--- +apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 +kind: KubeadmConfigTemplate +metadata: + name: example-standard + namespace: cluster-example +spec: + template: + spec: + files: + - path: /etc/containerd/config.toml + content: "version = 2\nimports = [\"/etc/containerd/conf.d/*.toml\"]\n[plugins]\n\ + \ [plugins.\"io.containerd.grpc.v1.cri\"]\n sandbox_image = \"k8s.gcr.io/pause:3.6\"\ + \n [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]\n\ + \ runtime_type = \"io.containerd.runc.v2\"\n [plugins.\"io.containerd.grpc.v1.cri\"\ + .containerd.runtimes.runc.options]\n SystemdCgroup = true\n [plugins.\"\ + io.containerd.grpc.v1.cri\".registry]\n [plugins.\"io.containerd.grpc.v1.cri\"\ + .registry.mirrors]\n [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"\ + docker.io\"]\n endpoint = [\"https://registry-1.docker.io\"]\n\ + \ [plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"eosregistry.azurecr.io\"\ + .auth]\n password = \"fzz7Q~ENWGZLq2EDBe2p_oTvw4ZhzZe0quWGZ\"\n \ + \ username = \"3bf0da11-ce47-42a7-995d-1f8dd40bc84f\"\n" + joinConfiguration: + nodeRegistration: + kubeletExtraArgs: + cloud-provider: gce + name: '{{ ds.meta_data.local_hostname.split(".")[0] }}' diff --git a/stratio-docs/en/modules/ROOT/assets/attachments/stratio-eks-policy.json b/stratio-docs/en/modules/ROOT/assets/attachments/stratio-eks-policy.json new file mode 100644 index 0000000000..1fba56886b --- /dev/null +++ b/stratio-docs/en/modules/ROOT/assets/attachments/stratio-eks-policy.json @@ -0,0 +1,240 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "arn:*:iam::*:role/aws-service-role/eks.amazonaws.com/AWSServiceRoleForAmazonEKS", + "Condition": { + "StringLike": { + "iam:AWSServiceName": "eks.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "arn:*:iam::*:role/aws-service-role/eks-nodegroup.amazonaws.com/AWSServiceRoleForAmazonEKSNodegroup", + "Condition": { + "StringLike": { + "iam:AWSServiceName": "eks-nodegroup.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "arn:*:iam::*:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling", + "Condition": { + "StringLike": { + "iam:AWSServiceName": "autoscaling.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "arn:*:iam::*:role/aws-service-role/elasticloadbalancing.amazonaws.com/AWSServiceRoleForElasticLoadBalancing", + "Condition": { + "StringLike": { + "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "arn:*:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot", + "Condition": { + "StringLike": { + "iam:AWSServiceName": "spot.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": "iam:PassRole", + "Resource": "*", + "Condition": { + "StringEquals": { + "iam:PassedToService": "eks.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": [ + "ec2:AuthorizeSecurityGroupIngress", + "ec2:DeleteSubnet", + "ec2:DescribeInstances", + "eks:UpdateAddon", + "iam:CreateRole", + "ec2:AttachInternetGateway", + "ec2:AssociateVpcCidrBlock", + "ec2:ReplaceRoute", + "ec2:AssociateRouteTable", + "ec2:DeleteRouteTable", + "ec2:DisassociateVpcCidrBlock", + "eks:DescribeAddon", + "ec2:DescribeInternetGateways", + "elasticloadbalancing:DeleteLoadBalancer", + "elasticloadbalancing:DescribeLoadBalancers", + "iam:AttachRolePolicy", + "iam:DetachRolePolicy", + "ec2:CreateRoute", + "ec2:CreateInternetGateway", + "autoscaling:DescribeAutoScalingGroups", + "ec2:DescribeVolumes", + "ec2:DescribeAccountAttributes", + "ec2:DeleteInternetGateway", + "autoscaling:DescribeInstanceRefreshes", + "ec2:DescribeKeyPairs", + "ec2:DescribeRouteTables", + "elasticloadbalancing:DeregisterInstancesFromLoadBalancer", + "elasticloadbalancing:RegisterInstancesWithLoadBalancer", + "ec2:DescribeLaunchTemplates", + "ec2:CreateTags", + "ec2:ModifyNetworkInterfaceAttribute", + "ec2:CreateRouteTable", + "ec2:RunInstances", + "iam:DeleteRole", + "iam:TagRole", + "ec2:DetachInternetGateway", + "ec2:DisassociateRouteTable", + "ec2:RevokeSecurityGroupIngress", + "elasticloadbalancing:DescribeLoadBalancerAttributes", + "elasticloadbalancing:AddTags", + "eks:CreateAddon", + "ec2:DeleteNatGateway", + "ec2:DeleteVpc", + "ec2:CreateSubnet", + "ec2:DescribeSubnets", + "elasticloadbalancing:ModifyLoadBalancerAttributes", + "ec2:DisassociateAddress", + "ec2:DescribeAddresses", + "tag:GetResources", + "ec2:DeleteTags", + "ec2:CreateNatGateway", + "elasticloadbalancing:ConfigureHealthCheck", + "ec2:CreateVpc", + "eks:ListAddons", + "ec2:DescribeVpcAttribute", + "ec2:ModifySubnetAttribute", + "elasticloadbalancing:RemoveTags", + "ec2:DescribeNetworkInterfaces", + "ec2:DescribeAvailabilityZones", + "ec2:DescribeNetworkInterfaceAttribute", + "ec2:CreateSecurityGroup", + "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer", + "ec2:ModifyVpcAttribute", + "ec2:DeleteLaunchTemplateVersions", + "eks:DescribeAddonVersions", + "ec2:ModifyInstanceAttribute", + "ec2:ReleaseAddress", + "ec2:DeleteLaunchTemplate", + "ec2:TerminateInstances", + "elasticloadbalancing:CreateLoadBalancer", + "elasticloadbalancing:DescribeTags", + "ec2:DescribeLaunchTemplateVersions", + "ec2:DescribeNatGateways", + "elasticloadbalancing:DeleteTargetGroup", + "ec2:AllocateAddress", + "ec2:DescribeSecurityGroups", + "ec2:CreateLaunchTemplateVersion", + "ec2:DescribeImages", + "ec2:CreateLaunchTemplate", + "eks:DeleteAddon", + "ec2:DescribeVpcs", + "ec2:DeleteSecurityGroup", + "eks:TagResource", + "ecr:GetAuthorizationToken", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage", + "ecr:BatchCheckLayerAvailability", + "iam:ListInstanceProfilesForRole", + "iam:CreateInstanceProfile", + "iam:AddRoleToInstanceProfile", + "iam:ListRoleTags", + "route53:ListHostedZones", + "iam:PutRolePolicy", + "iam:PassRole", + "iam:DeleteOpenIDConnectProvider" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": "iam:PassRole", + "Resource": "arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io" + }, + { + "Effect": "Allow", + "Action": [ + "iam:GetRole", + "iam:ListAttachedRolePolicies", + "iam:GetOpenIDConnectProvider", + "iam:CreateOpenIDConnectProvider", + "iam:ListOpenIDConnectProviders" + ], + "Resource": [ + "arn:*:iam::*:role/*", + "arn:*:iam::*:oidc-provider/*" + ] + }, + { + "Effect": "Allow", + "Action": [ + "kms:DescribeKey", + "kms:CreateGrant" + ], + "Resource": "*", + "Condition": { + "ForAnyValue:StringLike": { + "kms:ResourceAliases": "alias/cluster-api-provider-aws-*" + } + } + }, + { + "Effect": "Allow", + "Action": [ + "eks:UpdateClusterVersion", + "secretsmanager:CreateSecret", + "secretsmanager:DeleteSecret", + "eks:UpdateClusterConfig", + "ssm:GetParameter", + "eks:UpdateNodegroupVersion", + "eks:DescribeNodegroup", + "eks:AssociateEncryptionConfig", + "autoscaling:UpdateAutoScalingGroup", + "eks:ListIdentityProviderConfigs", + "autoscaling:DeleteTags", + "eks:DisassociateIdentityProviderConfig", + "iam:GetPolicy", + "eks:UntagResource", + "eks:CreateNodegroup", + "autoscaling:StartInstanceRefresh", + "eks:DeleteCluster", + "eks:DescribeIdentityProviderConfig", + "autoscaling:CreateOrUpdateTags", + "eks:DeleteNodegroup", + "eks:TagResource", + "eks:UpdateNodegroupConfig", + "eks:DescribeCluster", + "autoscaling:DeleteAutoScalingGroup", + "autoscaling:CreateAutoScalingGroup", + "eks:AssociateIdentityProviderConfig", + "secretsmanager:TagResource", + "eks:ListClusters", + "eks:CreateCluster" + ], + "Resource": [ + "arn:*:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/*", + "arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/*", + "arn:*:ssm:*:*:parameter/aws/service/eks/optimized-ami/*", + "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy", + "arn:*:eks:*:*:cluster/*", + "arn:*:eks:*:*:nodegroup/*/*/*" + ] + } + ] +} diff --git a/stratio-docs/en/modules/ROOT/assets/attachments/stratio-eks-temp-policy.json b/stratio-docs/en/modules/ROOT/assets/attachments/stratio-eks-temp-policy.json new file mode 100644 index 0000000000..3f8724db2f --- /dev/null +++ b/stratio-docs/en/modules/ROOT/assets/attachments/stratio-eks-temp-policy.json @@ -0,0 +1,51 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": [ + "iam:AddUserToGroup", + "cloudformation:deleteStack", + "iam:CreateInstanceProfile", + "iam:DeleteGroup", + "iam:ListAccessKeys", + "iam:RemoveUserFromGroup", + "iam:RemoveRoleFromInstanceProfile", + "iam:DeletePolicy", + "iam:CreateRole", + "iam:AttachRolePolicy", + "cloudformation:CreateChangeSet", + "iam:CreateUser", + "iam:AddRoleToInstanceProfile", + "cloudformation:updateStack", + "iam:PassRole", + "cloudformation:DescribeStackEvents", + "iam:DetachRolePolicy", + "cloudformation:UpdateStack", + "iam:DetachGroupPolicy", + "cloudformation:DescribeChangeSet", + "cloudformation:ExecuteChangeSet", + "iam:DeleteInstanceProfile", + "iam:GetRole", + "cloudformation:ListStacks", + "iam:CreateGroup", + "iam:GetPolicy", + "cloudformation:DescribeStackResources", + "iam:DeleteRole", + "iam:DeleteUser", + "cloudformation:GetTemplateSummary", + "cloudformation:DescribeStacks", + "iam:CreatePolicy", + "iam:ListPolicyVersions", + "cloudformation:CreateStack", + "iam:AttachGroupPolicy", + "cloudformation:DeleteStack", + "iam:GetUser", + "cloudformation:ValidateTemplate", + "cloudformation:createStack" + ], + "Resource": "*" + } + ] +} diff --git a/stratio-docs/en/modules/ROOT/assets/attachments/stratio-gcp-permissions.list b/stratio-docs/en/modules/ROOT/assets/attachments/stratio-gcp-permissions.list new file mode 100644 index 0000000000..543bcace76 --- /dev/null +++ b/stratio-docs/en/modules/ROOT/assets/attachments/stratio-gcp-permissions.list @@ -0,0 +1,68 @@ +compute.backendServices.create +compute.backendServices.delete +compute.backendServices.get +compute.backendServices.use +compute.disks.create +compute.disks.delete +compute.disks.get +compute.disks.list +compute.disks.resize +compute.disks.use +compute.disks.useReadOnly +compute.firewalls.create +compute.firewalls.delete +compute.firewalls.get +compute.globalAddresses.create +compute.globalAddresses.delete +compute.globalAddresses.get +compute.globalAddresses.use +compute.globalForwardingRules.create +compute.globalForwardingRules.delete +compute.globalForwardingRules.get +compute.globalOperations.get +compute.healthChecks.create +compute.healthChecks.delete +compute.healthChecks.get +compute.healthChecks.useReadOnly +compute.images.create +compute.images.delete +compute.images.get +compute.images.getFromFamily +compute.images.list +compute.images.useReadOnly +compute.instanceGroups.create +compute.instanceGroups.delete +compute.instanceGroups.get +compute.instanceGroups.update +compute.instanceGroups.use +compute.instances.attachDisk +compute.instances.create +compute.instances.delete +compute.instances.detachDisk +compute.instances.get +compute.instances.list +compute.instances.setLabels +compute.instances.setMetadata +compute.instances.setServiceAccount +compute.instances.setTags +compute.instances.use +compute.networks.create +compute.networks.get +compute.networks.updatePolicy +compute.projects.get +compute.regions.get +compute.routers.create +compute.routers.get +compute.subnetworks.create +compute.subnetworks.get +compute.subnetworks.use +compute.targetTcpProxies.create +compute.targetTcpProxies.delete +compute.targetTcpProxies.get +compute.targetTcpProxies.use +compute.zoneOperations.get +compute.zones.get +compute.zones.list +iam.serviceAccounts.actAs +monitoring.timeSeries.create +resourcemanager.projects.get diff --git a/stratio-docs/en/modules/ROOT/assets/images/autoescalado.png b/stratio-docs/en/modules/ROOT/assets/images/autoescalado.png new file mode 100644 index 0000000000..0aea6d3b6d Binary files /dev/null and b/stratio-docs/en/modules/ROOT/assets/images/autoescalado.png differ diff --git a/stratio-docs/en/modules/ROOT/assets/images/controllers.png b/stratio-docs/en/modules/ROOT/assets/images/controllers.png new file mode 100644 index 0000000000..a8011c4f3a Binary files /dev/null and b/stratio-docs/en/modules/ROOT/assets/images/controllers.png differ diff --git a/stratio-docs/en/modules/ROOT/assets/images/crds.png b/stratio-docs/en/modules/ROOT/assets/images/crds.png new file mode 100644 index 0000000000..33ad96397f Binary files /dev/null and b/stratio-docs/en/modules/ROOT/assets/images/crds.png differ diff --git a/stratio-docs/en/modules/ROOT/assets/images/eks-reference-architecture.png b/stratio-docs/en/modules/ROOT/assets/images/eks-reference-architecture.png new file mode 100644 index 0000000000..cfbc479aec Binary files /dev/null and b/stratio-docs/en/modules/ROOT/assets/images/eks-reference-architecture.png differ diff --git a/stratio-docs/en/modules/ROOT/assets/images/escalado-manual.png b/stratio-docs/en/modules/ROOT/assets/images/escalado-manual.png new file mode 100644 index 0000000000..723d165ae9 Binary files /dev/null and b/stratio-docs/en/modules/ROOT/assets/images/escalado-manual.png differ diff --git a/stratio-docs/en/modules/ROOT/assets/images/self-healing.png b/stratio-docs/en/modules/ROOT/assets/images/self-healing.png new file mode 100644 index 0000000000..f9056f21f6 Binary files /dev/null and b/stratio-docs/en/modules/ROOT/assets/images/self-healing.png differ diff --git a/stratio-docs/en/modules/ROOT/assets/images/upgrade-cp.png b/stratio-docs/en/modules/ROOT/assets/images/upgrade-cp.png new file mode 100644 index 0000000000..344b707caa Binary files /dev/null and b/stratio-docs/en/modules/ROOT/assets/images/upgrade-cp.png differ diff --git a/stratio-docs/en/modules/ROOT/assets/images/upgrade-w.png b/stratio-docs/en/modules/ROOT/assets/images/upgrade-w.png new file mode 100644 index 0000000000..268a569952 Binary files /dev/null and b/stratio-docs/en/modules/ROOT/assets/images/upgrade-w.png differ diff --git a/stratio-docs/en/modules/ROOT/nav.adoc b/stratio-docs/en/modules/ROOT/nav.adoc new file mode 100644 index 0000000000..91fee68034 --- /dev/null +++ b/stratio-docs/en/modules/ROOT/nav.adoc @@ -0,0 +1,5 @@ +* xref:ROOT:introduction.adoc[] +* xref:ROOT:architecture.adoc[] +* xref:ROOT:installation.adoc[] +* xref:ROOT:quick-start-guide.adoc[] +* xref:ROOT:operations.adoc[] diff --git a/stratio-docs/en/modules/ROOT/pages/architecture.adoc b/stratio-docs/en/modules/ROOT/pages/architecture.adoc new file mode 100644 index 0000000000..acf057fede --- /dev/null +++ b/stratio-docs/en/modules/ROOT/pages/architecture.adoc @@ -0,0 +1,91 @@ += Architecture + +Reference architecture + +image::eks-reference-architecture.png[] + +== Cloud provider objects + +=== EKS + +In a *default deployment*, the following objects are created in AWS (you can see in [silver]#gray# optional objects that will depend on what is specified in the cluster descriptor): + +* [silver]#1 VPC.# +* [silver]#6 subnets with their respective routing tables.# +** [silver]#3 public subnets (one per AZ).# +** [silver]#3 private subnets (also one per AZ).# +* [silver]#1 NAT gateway for each public subnet.# +* [silver]#1 Internet gateway for the VPC.# +* [silver]#1 default route in the routing table of each private subnet to go out to the Internet through the NAT gateways.# +* [silver]#1 default route in the routing table of each public subnet to exit the internet through the internet gateway.# +* 1 IAM policy for the nodes of the cluster (_nodes.cluster-api-provider-aws.sigs.k8s.io_). +* 1 IAM role for cluster nodes (_nodes.cluster-api-provider-aws.sigs.k8s.k8s.io_). +* 1 Elastic Kubernetes Service (EKS) cluster with add-ons for EBS and CNI, logging (if specified) and an OIDC provider. +** 2 EKS Security Groups for the control-plane and the worker nodes. +** 1 IAM role with AmazonEKSClusterPolicy. +* VMs for _Workers_ (according to cluster descriptor and auto-scaling). +** 1 EBS volume per persistent volume. +* 1 _Network_ type load balancer for service exposure. +** 1 _Listener_ per port for each _Service_ type load balancer. +* EBS volume for each persistent volume. + +=== GCP + +* 1 SSL/TCP load balancer for the API Server. +* 1 Health check for the _Unmanage Instance Group_. +* 1 CloudNat VPC partner. +* 1 Cloud Router. +* Firewall rules. +* 1 _Unmanage Instance Group_ for the _control-plane_. +* 1/3 VMs for the _control-plane_ (according to the cluster descriptor). +** 1 EBS Volume per VM. +* VMs for workers (according to the cluster descriptor and auto-scaling). +** 1 EBS volume per VM. +* 1 L4 load balancer for service exposure. +** 1 _Listener_ per port for each service of load balancer type. +* EBS volume for each persistent volume. + +== Security + +=== IMDS access in EKS + +Since pods running on an AWS node can impersonate the node where they run by simply interacting with IMDS, a global network policy (Calico's _GlobalNetworkPolicy_) is used to prevent access to all pods in the cluster. + +In turn, the EKS OIDC provider is enabled to allow the use of IAM roles for _Service Accounts_, ensuring the use of the IAM policies with minimal privileges. + +=== Access to the API Server endpoint + +==== EKS + +During the creation of the EKS cluster, an endpoint is created for the API Server. This endpoint is used to access the cluster from the installer and lifecycle operations. + +This endpoint is also published on the internet, and its access is restricted with a combination of AWS IAM (Identity and Access Management) rules, and Kubernetes' native RBAC (Role Based Access Control). + +==== GCP + +For API Server exposure, a load balancer is created with the name `-apiserver`. It has port 443 accessible by the public network (the assigned public IP is the same as configured in the _Kubeconfig_) and one _instance group_ per AZ (1 or 3, depending on HA configuration) with the corresponding _control-plane_ node. + +The _Health Check_ of the service is done via SSL, but it is recommended to change to HTTPS with the `/healthz` path. + +== Storage + +=== Nodes + +Regarding storage, a single root disk is mounted and its type, size and encryption can be defined. + +Example: + +[source,bash] +---- +type: gcp2 +size: 384Gi +encrypted: true +---- + +These disks are created in the initial provisioning of the worker nodes, so this data is passed as descriptor parameters. + +=== _StorageClass_ + +By default, the cluster provides a _StorageClass_ ("gp2" in AWS and "csi-gcp-pd" in GCP) for a block disk with _filesystem ext4_. This _StorageClass_ is created with `reclaimPolicy: Delete` and `volumeBindingMode: WaitForFirstConsumer`, i.e. the disk will be created at the moment a pod consumes the corresponding _PersistentVolumeClaim_, and deleted when the _PersistentVolume_ is deleted. + +It should be noted that the _PersistentVolumes_ created from this _StorageClass_ will have affinity to the area where they have been consumed. diff --git a/stratio-docs/en/modules/ROOT/pages/installation.adoc b/stratio-docs/en/modules/ROOT/pages/installation.adoc new file mode 100644 index 0000000000..9c6a414187 --- /dev/null +++ b/stratio-docs/en/modules/ROOT/pages/installation.adoc @@ -0,0 +1,526 @@ += Installation + +== Prerequisites + +=== EKS + +* Roles and policies ++ +For automated provisioning in EKS, it is necessary to execute actions on various AWS services such as ec2, ecr, eks, elasticloadbalancing, etc. While the use or lack of use of these actions will depend on the type of installation, the provider validates that the indicated user has these permissions in order to run normally. ++ +** xref:attachment$stratio-eks-policy.json [Download permanent permissions for EKS]. +** xref:attachment$stratio-aws-temp-policy.json[Download temporary permissions for EKS]. + +* Certified operating systems + +To ensure the functionalities supported by the EKS-managed _control-plane_, you should use any AMI provided by AWS specifically for this purpose. + +The https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-ami.html[AMIs optimized for Amazon EKS] are built on the Amazon Linux 2 operating system. + +=== GCP + +* Permissions + +For deployments on the Google Cloud Platform, you will require permissions on _compute_ (instances, disks, images, routers, networks, etc.). Similarly to other supported providers, provisioning requires an account with all requested permissions. ++ +xref:attachment$stratio-gcp-permissions.list[Download permissions for GCP]. + +* Certified operating systems ++ +For GCP environments, use https://github.com/kubernetes-sigs/image-builder/tree/master/images/capi[_image builder_], an official tool to create and distribute images for _Stratio KEOS_. ++ +The currently recommended operating system for this provider is Ubuntu 22.04. + +== Proprietary infrastructure + +Although one of the advantages of automatic resource creation in provisioning is the great dynamism it provides, for security and compliance reasons, it is often necessary to create certain resources prior to the deployment of _Stratio KEOS_ in the cloud provider. + +As it will be shown below, the provider supports the use of both a VPC and subnets previously created using the networks parameter in the cluster descriptor. + +== Descriptor of the cluster + +To indicate the specifics of the cluster, the _KeosCluster_ object is used in a manifest file. + +The header of this descriptor will be the same as for any Kubernetes object: + +[source,bash] +---- +apiVersion: installer.stratio.com/v1beta1 +kind: KeosCluster +spec: +---- + +=== _spec_ + +The _spec_ of the _KeosCluster_ is composed of the following fields: + +[cols="1,4,2,1"] +|=== +^|Name ^|Description ^|Example ^|Optional + +|cluster$$_$$id +|Cluster name. +|my-cluster +|No + +|infra$$_$$provider +|Name of the cloud provider (AWS o GCP). +|AWS +|No + +|<> +|Set of cloud provider credentials used in provisioning. +|See <>. +|Not in the first run. + +|k8s$$_$$version +|Kubernetes version of the cluster. It must be aligned with both the cloud provider and _Stratio KEOS_. Note: EKS does not take the patch version into account. +|v1.24.10 +|No + +|region +|Cloud provider region used for provisioning. +|eu-west-1 +|No + +|docker$$_$$registries +|Docker registries accessible by the nodes. +|- +|No + +|<> +|Identifiers of the previously created infrastructure. +|See <>. +|Yes + +|<> +|Specifications for the Kubernetes _control-plane_. +|See the <>. +|No + +|<> +|Specifications of the worker node groups. +|See <>. +|No + +|external$$_$$domain +|Domain external to the cluster. +|domain.ext +|No + +|<> +|Settings section for _Stratio KEOS_ installation. +|See the <>. +|No + +|=== + +=== Credentials + +On the first execution, the credentials for provisioning in the cloud provider will be indicated in this section. + +These secrets are encrypted with a passphrase requested from within the provisioning in the _secrets.yml_ file, thus removing the entire credentials section of the descriptor. + +In subsequent executions, the passphrase is simply requested to decrypt the secrets file, from which the credentials are read. + +The following fields are considered provisioning secrets: + +[cols="1,4,2,1"] +|=== +^|Name ^|Description ^|Example ^|Optional + +|aws +|Credentials for AWS access. +|See <>. +|Not when infra$$$_$$$provider=aws. + +|gcp +|Credentials for GCP access. +|see <>. +|Not when infra$$$_$$$provider=gcp. + +|github$$_$$token +|GitHub token. You can use a _Fine-grained token_ or a _classic_ type token, and you don't need any permissions. To generate it, go to: 'Settings' → 'Developer settings' → 'Personal access tokens'. +|github$$_$$pat$$_$$11APW. +|No + +|docker$$_$$registries +|Docker registries accessible by the nodes. For EKS, no authentication is needed, as it is done automatically with the user's credentials. +|- +|Yes + +|=== + +=== Networking + +As mentioned above, the installer allows you to use network elements of the cloud provider that you have previously created (e.g. by a network security team), thus enabling architectures that best suit your needs. + +Both the VPC and the subnets must be created in the cloud provider. The subnets can be private or public, but if they are public, they must have a _NAT gateway_ and an _Internet Gateway_ in the same VPC. If both types of subnets are specified, the worker nodes will be deployed in private subnets. + +_Stratio KEOS_ will not manage the lifecycle of previously created objects. + +[cols="1,4,2,1"] +|=== +^|Name ^|Description ^|Example ^|Optional + +|vpc$$_$$id +|VPC ID. +|vpc-0264503b8761ff69f +|Yes + +|_subnets_ +|Array of subnet IDs. +a| +[source,bash] +---- +- subnet_id: subnet-0df.. +- subnet_id: subnet-887.. +---- +|Yes + +|=== + +=== _control-plane_ + +In this section you will find the specifics for the Kubernetes _control-plane_. + +[cols="1,4,2,1"] +|=== +^|Name ^|Description ^|Example ^|Optional + +|aws +|Specific values for EKS logging (API Server, audit, authenticator, controller$$_$$manager and/or scheduler). + +a| +[source,bash] +---- +logging: + api_server: true +---- +|Yes + +|managed +|Specifies whether or not the _control-plane_ is managed in the cloud provider. +|true +|No + +|=== + +=== Worker nodes + +This section specifies the worker node groups and their characteristics. + +The images used must be supported by EKS (see https://repost.aws/knowledge-center/eks-custom-linux-ami[creation of custom AMIs]). + +[cols="1,4,2,1"] +|=== +^|Name ^|Description ^|Example ^|Optional + +|name +|Group name. To be used as a prefix for instances. +|eks-prod-gpu +|No + +|quantity +|Number of nodes in the group. It is recommended that the number is a multiple of 3 in order to avoid unbalanced zones. +|15 +|No + +|size +|Type of instance. +|t3.medium +|No + +|max$$_$$size / min$$_$$size +|Maximum and minimum number of instances for autoscaling. +|6 / 18. +|Yes + +|az +|Zone for the whole group (overrides the zone$$_$$distribution parameter). +|eu-east-1a +|Yes + +|zone$$_$$distribution +|Indicates whether the nodes will be equally distributed in the zones (default) or not. +|unbalanced +|Yes + +|node$$_$$image +|Instance image used for the worker nodes. +|ami-0de933c15c9b49fb5 +|Not for infra$$_$$provider: gcp + +|_labels_ +|Kubernetes labels for worker nodes. +a| +[source,bash] +---- +labels: + disktype: standard + gpus: true +---- +|Yes + +|root$$_$$volume +|Volume specifics such as size, type and encryption. +a| +[source,bash] +---- +root_volume: + size: 50 + type: gp2 + encrypted: true +---- +|Yes + +|ssh$$_$$key +|Public SSH key to access worker nodes. It must be previously created in AWS. It is recommended not to add any SSH key to the nodes. +|prod-key +|Yes + +|=== + +=== _Stratio KEOS_ + +The parameters for the _keos-installer_ phase will be indicated in this section. + +[cols="1,4,2,1"] +|=== +^|Name ^|Description ^|Example ^|Optional + +|flavour +|Installation flavor, which indicates cluster size and resiliency. The default is `production`. +|development +|Yes + +|version +|_keos-installer_ version. +|0.8.0 +|No + +|=== + +=== Descriptor example + +In this section, you will find two descriptor cases to demonstrate the capability of the cloud provisioner in the supported cloud providers. + +==== EKS + +In this example you can see the following particularities: + +* Cluster on AWS with managed _control-plane_ (EKS). +* Kubernetes version 1.24.x (EKS does not take into account the patch version). +* Use of ECR as Docker registry (no credentials needed). +* Use of VPC and custom subnets ( previously created). This section is optional. +* API Server logs are enabled in EKS. +* Groups of workers nodes with multiple casuistry: +** Several instance types. +** With specific AMI (optional for this cloud provider). Note: the versions of the components in the image must be aligned with the Kubernetes version indicated. +** With SSH key. +** With K8s labels. +** With auto-scaling ranges. +** In a fixed zone. +** With customizations on disk. +** With spot-type instances. +** Distribution cases in AZs: balanced and unbalanced. + +[source,bash] +---- +apiVersion: installer.stratio.com/v1beta1 +kind: KeosCluster +spec: + cluster_id: eks-prod + infra_provider: aws + credentials: + aws: + region: eu-west-1 + access_key: AKIAT4.. + account: '3683675..' + secret_key: wq3/Vsc.. + github_token: github_pat_11APW.. + k8s_version: v1.24.0 + region: eu-west-1 + networks: + vpc_id: vpc-02698.. + subnets: + - subnet_id: subnet-0416d.. + - subnet_id: subnet-0b2f8.. + - subnet_id: subnet-0df75.. + docker_registries: + - url: AABBCC.dkr.ecr.eu-west-1.amazonaws.com/keos + auth_required: false + type: ecr + keos_registry: true + control_plane: + aws: + logging: + api_server: true + managed: true + worker_nodes: + - name: eks-prod-xlarge + quantity: 6 + max_size: 18 + min_size: 6 + size: m6i.xlarge + labels: + disktype: standard + root_volume: + size: 50 + type: gp3 + encrypted: true + ssh_key: stg-key + - name: eks-prod-medium-spot + quantity: 4 + zone_distribution: unbalanced + size: t3.medium + spot: true + labels: + disktype: standard + - name: eks-prod-medium-az + quantity: 3 + size: t3.medium + az: eu-west-1c + node_image: ami-0de933c15c9b49fb5 + external_domain: domain.ext + keos: + domain: cluster.local + flavour: production + version: 0.8.1 +---- + +==== GCP + +In this example you can see the following particularities: + +* Cluster on GCP with unmanaged _control-plane_. +* Use of a Docker registry with generic authentication (with the corresponding credentials). +* No DNS zone control (enabled by default). +* VM characteristics for the _control-plane_: +** With high availability (3 instances are deployed). +** With specific instance type. +** With specific image (mandatory for this cloud provider). Note: the versions of the components in the image must match the Kubernetes version indicated. +** With customizations on disk. +* Groups of worker nodes with multiple scenarios: +** Different instance types. +** With specific image (mandatory for this cloud provider). Note: the versions of the image components must be aligned with the Kubernetes version indicated. +** With SSH key. +** With K8s labels. +** With auto-scaling ranges. +** In a fixed zone. +** With customizations on disk. +** With spot-type instances. +** Distribution cases in AZs: balanced and unbalanced. + +[source,bash] +---- +apiVersion: installer.stratio.com/v1beta1 +kind: KeosCluster +spec: + cluster_id: gcp-prod + infra_provider: gcp + credentials: + gcp: + private_key_id: "efdf19f5605a.." + private_key: "-----BEGIN PRIVATE KEY-----\nMIIEvw.." + client_email: keos@stratio.com + project_id: gcp-prod + region: europe-west4 + github_token: github_pat_11APW.. + docker_registries: + - url: keosregistry.stratio.com/keos + user: "myuser" + pass: "mypass" + k8s_version: v1.24.12 + region: europe-west4 + docker_registries: + - url: keosregistry.stratio.com/keos + auth_required: true + type: generic + keos_registry: true + dns: + manage_zone: false + control_plane: + managed: false + highly_available: true + size: c2d-highcpu-4 + node_image: projects/gcp-prod/global/images/ubuntu-2204-v1-24-12-1679997686 + worker_nodes: + - name: gcp-prod-xlarge + quantity: 6 + max_size: 18 + min_size: 6 + size: c2d-highcpu-4 + labels: + disktype: standard + root_volume: + size: 50 + type: pd-standard + encrypted: true + node_image: projects/gcp-prod/global/images/ubuntu-2204-v1-24-12-1679997686 + ssh_key: stg-key + - name: gcp-prod-medium-spot + quantity: 4 + zone_distribution: unbalanced + size: c2d-highcpu-4 + spot: true + labels: + disktype: standard + node_image: projects/gcp-prod/global/images/ubuntu-2204-v1-24-12-1679997686 + - name: gcp-prod-medium-az + quantity: 3 + size: c2d-highcpu-4 + az: europe-west4-a + node_image: projects/gcp-prod/global/images/ubuntu-2204-v1-24-12-1679997686 + external_domain: domain.ext + keos: + domain: cluster.local + flavour: production + version: 0.8.1 +---- + +== Provider + +_Cloud provisioner_ is a tool that facilitates the provisioning of the necessary elements in the specified cloud provider to create a Kubernetes cluster based on the specified <>. + +Currently, this binary includes the following options: + +- `--descriptor`: indicates the path to the cluster descriptor. +- `--vault-password`: specifies the passphrase for credentials encryption. +- `--avoid-creation`: does not create the cluster worker, only the cluster local. +- `--keep-mgmt`: creates the cluster worker but leaves its management in the cluster local. +- `--retain`: keeps the cluster local even without management. + +To create a cluster, a simple command is enough: + +[source,bash] +----- +sudo ./cloud-provisioner create cluster --name stratio-pre --descriptor cluster-gcp.yaml +Vault Password: +Rewrite Vault Password: +Creating temporary cluster "stratio-pre" ... + ✓ Ensuring node image (kindest/node:v1.24.7) 🖼 + ✓ Building Stratio image (stratio-capi-image:v1.24.7) 📸 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 + ✓ Installing CAPx 🎖️ + ✓ Generating workload cluster manifests 📝 + ✓ Generating secrets file 📝🗝️ + ✓ Creating the workload cluster 💥 + ✓ Saving the workload cluster kubeconfig 📝 + ✓ Installing Calico in workload cluster 🔌 + ✓ Installing StorageClass in workload cluster 💾 + ✓ Preparing nodes in workload cluster 📦 + ✓ Enabling workload cluster's self-healing 🏥 + ✓ Installing CAPx in workload cluster 🎖️ + ✓ Adding Cluster-Autoescaler 🗚 + ✓ Moving the management role 🗝️ + ✓ Generating the KEOS descriptor 📝 + +The cluster has been installed, please refer to _Stratio KEOS_ documentation on how to proceed. +----- + +Once the process is finished, you will have the necessary files (_keos.yaml_ and _secrets.yml_) to install _Stratio KEOS_. diff --git a/stratio-docs/en/modules/ROOT/pages/introduction.adoc b/stratio-docs/en/modules/ROOT/pages/introduction.adoc new file mode 100644 index 0000000000..9291f02e06 --- /dev/null +++ b/stratio-docs/en/modules/ROOT/pages/introduction.adoc @@ -0,0 +1,5 @@ += Introduction + +_Stratio KEOS_ has the ability to be deployed on various cloud providers. Currently, it natively supports both xref:ROOT:architecture.adoc#_gcp[Google Cloud Platform (GCP)] in unmanaged mode and Amazon Web Services (AWS) in managed mode with xref:ROOT:architecture.adoc#_eks[Elastic Kubernetes Service (EKS)]. + +The version of _Stratio KEOS_ on the cloud providers is 0.2.0. diff --git a/stratio-docs/en/modules/ROOT/pages/operations.adoc b/stratio-docs/en/modules/ROOT/pages/operations.adoc new file mode 100644 index 0000000000..c4521c0eb7 --- /dev/null +++ b/stratio-docs/en/modules/ROOT/pages/operations.adoc @@ -0,0 +1,297 @@ += Operations + +== Obtaining the _kubeconfig_ + +To communicate with the API Server of the created cluster, it is necessary the _kubeconfig_ file, which will be obtained differently depending on the cloud provider used and the management of the cluster _control-plane_. + +* For EKS, it will be obtained as indicated by AWS: + +[source,bash] +----- +aws eks update-kubeconfig --region eu-west-1 --name stg-eks --kubeconfig /data/stratio/kubernetes/cluster-api/aws/workspace/stg-eks.kubeconfig +----- + +* For GCP, at the end of provisioning, the _kubeconfig_ is left in the workspace directory: + +[source,bash] +----- +ls ./.kube/config +./.kube/config +----- + +== Authentication in EKS + +While not part of the _Stratio KEOS_ operation, it is important to highlight how to enable https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html[authentication of other users in an EKS cluster] (the cluster creator user is authenticated by default). + +To give Kubernetes-admin permissions on the cluster, the user's ARN will be added in the _ConfigMap_ below. + +[source,bash] +---- +$ k -n kube-system edit cm aws-auth +.. +data: + mapUsers: | + - groups: + - system:masters + userarn: + username: kubernetes-admin +---- + +== Infrastructure operation + +image::controllers.png[] + +Using the objects of the previous section, _Stratio KEOS_ is able to perform the following operations by interacting only with the API Server. + +The _controllers_ deployed will be the ones to perform the necessary tasks in the reconciliation cycles. + +=== CRDs + +image::crds.png[] + +For the specified API management of the cluster, the following object groups are created: + +- _MachineDeployment_, _EKSConfigTemplate_ and _AWSMachineTemplate_ will be used to define workers nodes. +- To define _control-plane_ (EKS) parameters, the _AWSManagedControlPlane_ object will be used. +- To indicate the _self-healing_ parameters, a _MachineHealthCheck_ is used for the whole cluster. + +=== _Self-healing_ + +image::self-healing.png[] + +The _self-healing_ capability of the cluster is managed by the _MachineHealthCheck_ object: + +[source,bash] +---- +$ k -n cluster-example get mhc -o yaml +... + spec: + clusterName: example + maxUnhealthy: 100% + nodeStartupTimeout: 5m0s + selector: + matchLabels: + keos.stratio.com/machine-role: example-worker-node + unhealthyConditions: + - status: Unknown + timeout: 1m0s + type: Ready + - status: "False" + timeout: 1m0s + type: Ready +... +---- + +==== Failover test on a node + +In case of failure in a node, it will be detected by a controller and it will be replaced by deleting it and recreating another one of the same group, which ensures the same characteristics. + +To simulate a VM failure, it will be deleted from the cloud provider's web console. + +Node recovery comprises the following phases and times: + +[source,bash] +---- +. Terminate VM from console: 0s +. New VM is Provisioning: 50s +. Old Machine is Deleted & the new one is Provisioned: 1m5s +. New Machine is Running & new k8s node is NotReady: 1m 50s +. New k8s node is Ready: 2m +---- + +=== Static scaling + +Although manual scaling is discouraged, these operations are provided for cases where there is no autoscaling or new node groups. + +==== Scaling a workers group + +image::escalado-manual.png[] + +To manually scale a group of workers, you can use the _MachineDeployment_ object, which supports the _scale_ command of kubectl: + +[source,bash] +---- +kubectl -n cluster-stg-eks scale --replicas 3 MachineDeployment --all +---- + +You can see the new number of replicas and the new _Machine_ objects: + +[source,bash] +---- +kubectl -n cluster-stg-eks get MachineDeployment +kubectl -n cluster-stg-eks get Machine +---- + +==== Create a new workers group + +===== EKS + +The following three objects must be created in EKS: _MachineDeployment_, _AWSMachineTemplate_ and _EKSConfigTemplate_. + +Once the manifest has been created, the creation of the group simply consists of applying it to the cluster as follows: + +[source,bash] +---- +kubectl apply -f xref:attachment$example-eks-md.yaml[example-eks-md.yaml] +---- + +To view the created objects: + +[source,bash] +---- +kubectl -n cluster-example get md,eksct,awsmt +---- + +===== GCP + +For GCP, the following will be created: _MachineDeployment_, _GCPMachineTemplate_ and _KubeadmConfigTemplate_. + +In the same way, the manifest is applied to create the new workers group: + +[source,bash] +---- +kubectl apply -f xref:attachment$example-gcp-md.yaml[example-gcp-md.yaml] +---- + +To see the created objects: + +[source,bash] +---- +kubectl -n cluster-example get md,gcpmachinetemplate,kubeadmconfigtemplate +---- + +==== Vertical scaling + +Vertical scaling of a node group can be done in several ways, all of which will start by changing the instance type of the `MachineTemplate` object. + +TIP: Although the official guidelines require creating a new `MachineTemplate` and referencing it from the _MachineDeployment_, this option is not recommended. It prevents maintaining naming consistency between the objects that manage the node groups. + +The recommended method is based on 3 simple steps: + +. specify the new instance type in `MachineTemplate` (_spec.template.spec.instanceType_). In some vendors, this object will have to be deleted and created anew. +. Get the version of the new `MachineTemplate` object (_metadata.resourceVersion_). +. Edit the _MachineDeployment_ by updating the version obtained in the previous step (_spec.template.spec.infrastructureRef.resourceVersion_). + +An example of an EKS cluster would be as follows: + +[source,bash] +---- +export MACHINE_TYPE="t3.medium" +export MACHINE_DEPLOYMENT="stg-eks-xlarge-md-2" +export NAMESPACE="cluster-stg-eks" + +$ k -n $NAMESPACE patch awsmt $MACHINE_DEPLOYMENT --type merge -p "{\"spec\": {\"template\": {\"spec\": {\"instanceType\": "$MACHINE_TYPE"}}}}" + +$ RESOURCE_VERSION=$(k -n $NAMESPACE get awsmt $MACHINE_DEPLOYMENT -o json | jq -r .metadata.resourceVersion) + +$ k -n $NAMESPACE patch md $MACHINE_DEPLOYMENT --type merge -p "{\"spec\": {\"template\": {\"spec\": {\"infrastructureRef\": {\"resourceVersion\": \"$RESOURCE_VERSION\"}}}}}" +---- + +=== Autoscaling + +image::autoescalado.png[] + +The _cluster-autoscaler_ is used for node autoscaling. It will detect pods pending execution due to a lack of resources and it will scale groups of nodes according to the deployment filters. + +This operation is performed in the API Server. The controllers are in charge of creating the VMs in the cloud provider and adding them to the cluster as Kubernetes worker nodes. + +Since the autoscaling is based on the _cluster-autoscaler_, the minimum and maximum will be added in the worker's node group as annotations: + +[source,bash] +---- +$ kubectl -n cluster-stg-eks edit MachineDeployment demo-eks-md-2 + +- apiVersion: cluster.x-k8s.io/v1beta1 + kind: MachineDeployment + metadata: + annotations: + cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: "6" + cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: "2" + ... +---- + +==== Test + +To test autoscaling, you can create a deployment with enough replicas to prevent them from running on the current nodes: + +[source,bash] +---- +kubectl create deploy test --replicas 1500 --image nginx:alpine +---- + +At the end of the test, remove the deployment: + +[source,bash] +---- +kubectl --kubeconfig demo-eks.kubeconfig delete deploy test +---- + +==== Logs + +The logs of the _cluster-autoscaler_ can be seen from its deployment: + +[source,bash] +---- +$ k -n kube-system logs -f -l app.kubernetes.io/name=clusterapi-cluster-autoscaler +---- + +=== Version upgrade + +The upgrade of the cluster to a higher version of Kubernetes will be performed in two parts, first the _control-plane_ and, once this is on the new version, the workers nodes. + +==== _Control-plane_ + +image::upgrade-cp.png[] + +For the _control-plane_ update, a _spec.version_ patch will be executed on the _AWSManagedControlPlane_ object. + +[source,bash] +---- +$ kubectl -n cluster-example patch AWSManagedControlPlane example-control-plane --type merge -p '{"spec": {"version": "v1.24.0"}}' +---- + +==== Workers + +image::upgrade-w.png[] + +For each group of worker nodes in the cluster, a _spec.template.spec.version_ patch will be executed on the _MachineDeployment_ object corresponding to the group. + +[source,bash] +---- +$ kubectl -n cluster-example patch MachineDeployment example-md-1 --type merge -p '{"spec": {"template": {"spec": {"version": "v1.24.0"}}}}' +---- + +NOTE: The controller provisions a new node in the worker's group with the updated version and, once it is ready in Kubernetes, deletes a node with the old version. This way, it always ensures the configured number of nodes. + +=== Cluster removal + +Prior to the deletion of the cloud provider resources generated by the _cloud provisioner_, you must delete those that have been created by the _keos-installer_ or any external automation. + +. A local cluster is created indicating that no objects are generated in the cloud provider. ++ +[source,bash] +----- +[local]$ sudo ./bin/cloud-provisioner create cluster --name prod-cluster --descriptor cluster.yaml --vault-password --avoid-creation +----- ++ +. The management of the cluster worker is moved to the local cluster, using the corresponding _kubeconfig_ (note that for the managed _control-planes_ the _kubeconfig_ of the provider will be needed). To ensure this step, look for the following text in the command output: *Moving Cluster API objects Clusters=1*. ++ +[source,bash] +----- +[local]$ sudo clusterctl --kubeconfig $KUBECONFIG move -n cluster-prod-eks --to-kubeconfig /root/.kube/config +----- ++ +. The cluster local is accessed locally and the cluster worker is removed. ++ +[source,bash] +----- +[local]$ sudo docker exec -ti prod-eks-control-plane bash +root@prod-eks-control-plane:/# k -n cluster-prod-eks delete cl --all +----- ++ +. Finally, the cluster local is eliminated. ++ +[source,bash] +----- +[local]$ sudo ./bin/cloud-provisioner delete cluster --name prod-eks +----- diff --git a/stratio-docs/en/modules/ROOT/pages/quick-start-guide.adoc b/stratio-docs/en/modules/ROOT/pages/quick-start-guide.adoc new file mode 100644 index 0000000000..50b0147713 --- /dev/null +++ b/stratio-docs/en/modules/ROOT/pages/quick-start-guide.adoc @@ -0,0 +1,240 @@ += Quick start guide + +== EKS + +=== Prerequisites + +* For a user with the required privileges in AWS: +** Create a user for installation. +** Create policy according to xref:attachment$stratio-eks-policy.json[_stratio-eks-policy.json_]. +** Create policy according to xref:attachment$stratio-aws-temp-policy.json[_stratio-aws-temp-policy.json_] (for provisioning only). +** Attach policies to the user. +** Create an access key. +* Private and public hosted zones created in AWS (optional). +* Custom infrastructure created on AWS (optional). +* Compose the cluster descriptor file. +** User credentials (_access$$_$$key_ and _secret$$_$$key_) and account data (region and _account$$_$$id_), which will be encrypted on first run. +** GitHub token for downloading templates. +** Account data (region and _account$$_$$id_). +** Data of the infrastructure already created (optional). +** DNS zones of the created hosted zones (optional). +** ECR URL. +** Enable logging in EKS per component (optional). +** Node groups. +** Information required for the installation of _Stratio KEOS_. + +Regarding the _control-plane_, in the cluster descriptor you can indicate that it is a *_managed_control-plane_* and the logs that you want to activate (_APIserver_, _audit_, _authenticator_, _controller$$_$$manager_ and/or _scheduler_). + +Likewise, *groups of worker nodes* can be indicated with the following options: + +* _name_: group name, cannot be repeated. +* _size_: instance type. +* _quantity_: number of _workers_ in the group. +* _min$$_$$size_: minimum number of nodes for autoscaling (optional). +* _max$$_$$size_: maximum number of nodes for autoscaling (optional). +* _labels_: node labels in Kubernetes (optional). +* _root$$_$$volume_: disk specifics (optional). +** _size_: size in GB (default: 30GB). +** _type_: disk type (default: gp2). +** _encrypted_: disk encryption (default: _false_). +* _ssh$$_$$key_: SSH key for node access (optional). Must exist in the provider. +* _spot_: indicates if the instance is of spot type (optional). +* _node$$_$$image_: the image of the worker nodes (optional). The indicated image must exist and be compatible with EKS. +* _zone$$_$$distribution_: indicates whether the number of nodes must be balanced in the zones or not (default: _balanced_). +* _az_: zone of the worker's group (optional). If specified, only this one will be used for the whole group. This parameter overrides what is specified in _zone$$_$$distribution_. + +NOTE: By default, the distribution of nodes will be done in zones a, b and c of the indicated region in a balanced way, therefore, the rest of the division by three of the number of nodes will be discarded. Example: if 'quantity=7' is specified, only 2 nodes will be deployed in each of the zones. + +==== _keos-installer_ + +In order to facilitate the installation of _Stratio KEOS_, in the provisioning process a functional _keos.yaml_ file is generated and ready to launch the installation. For this purpose, the version and flavor (_production_, _development_ or _minimal_) can be indicated in the cluster descriptor. + +[source,bash] +---- + keos: + version: 0.8.1 + flavour: development +---- + +For any extra customization, the file must be modified before running the _keos-installer_. + +==== Considerations + +* If you use custom infrastructure, you must indicate the VPC and 3 subnets, one per region zone (a, b and c). +* The Kubernetes version indicated must be supported by EKS. +* The _worker$$_$$nodes_ group names cannot be repeated. + +TIP: For more details, see the xref:ROOT:installation.adoc[installation guide]. + +=== Installation + +You should run the provisioning and installation of the Kubernetes phase, from a Linux machine with internet access and a Docker installed. + +Once you have downloaded the `.tgz` file of the _cloud-provisioner_, proceed to unzip it and run it with the creation parameters: + +[source,bash] +---- +$ tar xvzf cloud-provisioner-*tar.gz +$ sudo ./bin/cloud-provisioner create cluster --name --descriptor cluster.yaml +Creating temporary cluster "example-eks" ... + ✓ Ensuring node image (kindest/node:v1.24.7) 🖼 + ✓ Building Stratio image (stratio-capi-image:v1.24.7) 📸 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 + ✓ Installing CAPx 🎖️ + ✓ Generating workload cluster manifests 📝 + ✓ Generating secrets file 📝🗝️ + ✓ [CAPA] Ensuring IAM security 👮 + ✓ Creating the workload cluster 💥 + ✓ Saving the workload cluster kubeconfig 📝 + ✓ Preparing nodes in workload cluster 📦 + ✓ Enabling workload cluster's self-healing 🏥 + ✓ Installing CAPx in workload cluster 🎖️ + ✓ Installing Network Policy Engine in workload cluster 🚧 + ✓ Adding Cluster-Autoescaler 🗚 + ✓ Moving the management role 🗝️ + ✓ Generating the KEOS descriptor 📝 + ✓ Cleaning up temporary cluster 🧹 + +The cluster has been installed, please refer to _Stratio KEOS_ documentation on how to proceed. +---- + +=== Next steps + +At this point, you will have a Kubernetes cluster with the features indicated in the descriptor and you will be able to access the EKS API Server with the AWS CLI as indicated in https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html[the official documentation]. + +[source,bash] +---- +$ aws eks update-kubeconfig --region --name --kubeconfig ./.kubeconfig + +$ kubectl --kubeconfig ./.kubeconfig get nodes +---- + +Here, the permissions of _clusterawsadm.json_ can be removed. + +Next, proceed to deploy _Stratio KEOS_ *using _keos-installer_*. + +== GCP + +=== Prerequisites + +* Create an _IAM Service Account_ with the permissions defined in xref:attachment$stratio-gcp-permissions.list[stratio-gcp-permissions.list]. +* Create a private key for the _IAM Service Account_ of type JSON and download it in a `-.json` file. This data will be used for the credentials requested in the cluster descriptor. +* Deploy a "Cloud NAT" in the region (requires a "Cloud Router", but can be created in the wizard itself). +* Private and public zones in Cloud DNS created in GCP (optional). +* Custom infrastructure created in GCP (optional). +* Compose the cluster descriptor file. +** User credentials (_private$$_$$key$$_$$id_, _private$$_$$key_ and _client$$_$$email_) and account data (region and _project$$_$$id_), which will be encrypted on first run. +** GitHub token for template download. +** Data of the already created infrastructure (optional). +** DNS zone of the created zones (optional). +** Docker registry data (URL, credentials). +** External domain of the cluster. +** _control-plane_. +** Node groups. +** Information necessary for the installation of _Stratio KEOS_. + +==== _control-plane_ nodes + +For this provider, the _control-plane_ will be deployed in virtual machines, therefore, the following options can be configured: + +* _highly$$_$$available_: defines whether the _control-plane_ will have high availability (default: _true_). +* _managed_: indicates that it is a _control-plane_ in virtual machines. +* _size_: instance type. +* _node$$_$$image_: image of the nodes of the _control-plane_. The indicated image must exist in the referenced project. +* _root$$_$$volume_: disk particularities (optional). +** _size_: size in GB (default: 30GB). +** _type_: disk type (default: gp2). +** _encrypted_: disk encryption (default: _false_). + +==== Worker nodes + +In the cluster descriptor, groups of worker nodes can be indicated with the following options: + +* _name_: group name, cannot be repeated. It must start with "-". +* _size_: instance type. +* _quantity_: number of workers in the group. +* _min$$_$$size_: minimum number of nodes for autoscaling (optional). +* _max$$_$$size_: maximum number of nodes for autoscaling (optional). +* _labels_: node labels in Kubernetes (optional). +* _root$$_$$volume_: disk specifics (optional). +** _size_: size in GB (default: 30GB). +** _type_: disk type (default: gp2). +** _encrypted_: disk encryption (default: _false_). +* _ssh$$_$$key_: SSH key for node access (optional). Must exist in the provider. +* _spot_: indicates if the instance is of type _spot_ (optional). +* _node$$_$$image_: the image of the worker nodes. The indicated image must exist and be compatible with EKS. +* _zone$$_$$distribution_: indicates whether the number of nodes must be balanced in the zones or not (default: _balanced_). +* _az_: zone of the worker's group (optional). If specified, only this one will be used for the whole group. This parameter overrides what is specified in _zone$$_$$distribution_. + +NOTE: By default, the distribution of nodes will be done in zones a, b and c of the indicated region in a balanced way, therefore, the rest of the division by three of the number of nodes will be discarded. Example: if 'quantity=7' is specified, only 2 nodes will be deployed in each of the zones. + +==== _keos-installer_ + +In order to facilitate the installation of _Stratio KEOS_, in the provisioning process a functional _keos.yaml_ file is generated and ready to launch the installation. For this purpose, the version and flavor ('production', 'development' or 'minimal') can be indicated in the cluster descriptor. + +[source,bash] +---- + keos: + version: 0.8.1 + flavour: development +---- + +For any extra customization, the file must be modified before running the _keos-installer_. + +=== Considerations + +* If you use custom infrastructure, you must indicate the VPC and 3 subnets, one per region zone (a, b and c). +* The configured Kubernetes version must be the one supported in the indicated images. +* _worker$$_$$nodes_ cluster names cannot be repeated and must start with "-". + +TIP: For more details, see the xref:ROOT:installation.adoc[installation guide]. + +== Installation + +You should run the provisioning and installation of the Kubernetes phase, from a Linux machine with internet access and a Docker installed. + +Once you have downloaded the `.tgz` file of the _cloud provisioner_, proceed to unzip it and run it with the creation parameters: + +[source,bash] +---- +$ tar xvzf cloud-provisioner-*tar.gz +$ sudo ./bin/cloud-provisioner create cluster --name --descriptor cluster.yaml +Creating temporary cluster "example-gcp" ... + ✓ Ensuring node image (kindest/node:v1.24.7) 🖼 + ✓ Building Stratio image (stratio-capi-image:v1.24.7) 📸 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 + ✓ Installing CAPx 🎖️ + ✓ Generating workload cluster manifests 📝 + ✓ Generating secrets file 📝🗝️ + ✓ Creating the workload cluster 💥 + ✓ Saving the workload cluster kubeconfig 📝 + ✓ Installing Calico in workload cluster 🔌 + ✓ Installing StorageClass in workload cluster 💾 + ✓ Preparing nodes in workload cluster 📦 + ✓ Enabling workload cluster's self-healing 🏥 + ✓ Installing CAPx in workload cluster 🎖️ + ✓ Adding Cluster-Autoescaler 🗚 + ✓ Moving the management role 🗝️ + ✓ Generating the KEOS descriptor 📝 + +The cluster has been installed, please refer to _Stratio KEOS_ documentation on how to proceed. +---- + +== Next steps + +At this point, you will have a Kubernetes cluster with the features indicated in the descriptor and you will be able to access the API Server with the _kubeconfig_ generated in the current directory (_.kube/config_): + +[source,bash] +---- +$ kubectl --kubeconfig .kube/config get nodes +---- + +Next, proceed to deploy _Stratio KEOS_ *using _keos-installer_*. diff --git a/stratio-docs/es/antora.yml b/stratio-docs/es/antora.yml new file mode 100644 index 0000000000..a3181424b2 --- /dev/null +++ b/stratio-docs/es/antora.yml @@ -0,0 +1,6 @@ +name: cloud-provisioner +title: Stratio Cloud Provisioner +version: '0.2' +nav: +- modules/ROOT/nav.adoc +start_page: introduction.adoc diff --git a/stratio-docs/es/modules/ROOT/assets/attachments/example-aks-md.yaml b/stratio-docs/es/modules/ROOT/assets/attachments/example-aks-md.yaml new file mode 100644 index 0000000000..98ffd45e6c --- /dev/null +++ b/stratio-docs/es/modules/ROOT/assets/attachments/example-aks-md.yaml @@ -0,0 +1,48 @@ +--- +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachinePool +metadata: + name: example-medium + namespace: cluster-example +spec: + clusterName: example + replicas: 1 + template: + metadata: + labels: + keos.stratio.com/machine-role: example-worker-node + spec: + bootstrap: + dataSecretName: "" + clusterName: example + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: AzureManagedMachinePool + name: example-medium + version: v1.24.15 +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: AzureManagedMachinePool +metadata: + name: example-medium + namespace: cluster-example +spec: + mode: System + name: worker1mp0 + sku: Standard_D8_v3 + osDiskSizeGB: 50 + osDiskType: Managed + availabilityZones: + - "1" + scaleSetPriority: Regular + scaling: + minSize: 1 + maxSize: 7 + nodeLabels: + backup: "false" + taints: + - key: "gpu" + value: "true" + effect: "NoSchedule" +--- + diff --git a/stratio-docs/es/modules/ROOT/assets/attachments/example-eks-md.yaml b/stratio-docs/es/modules/ROOT/assets/attachments/example-eks-md.yaml new file mode 100644 index 0000000000..c43dfe0228 --- /dev/null +++ b/stratio-docs/es/modules/ROOT/assets/attachments/example-eks-md.yaml @@ -0,0 +1,74 @@ +--- +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachineDeployment +metadata: + annotations: + cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: "3" + cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: "1" + labels: + cluster.x-k8s.io/cluster-name: example + name: example-medium + namespace: cluster-example +spec: + clusterName: example + minReadySeconds: 0 + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 1 + selector: + matchLabels: + cluster.x-k8s.io/cluster-name: example + cluster.x-k8s.io/deployment-name: example-medium + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + template: + metadata: + labels: + cluster.x-k8s.io/cluster-name: example + cluster.x-k8s.io/deployment-name: example-medium + spec: + bootstrap: + configRef: + apiVersion: bootstrap.cluster.x-k8s.io/v1beta2 + kind: EKSConfigTemplate + name: example-medium + namespace: cluster-example + clusterName: example + failureDomain: eu-west-1c + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 + kind: AWSMachineTemplate + name: example-medium + namespace: cluster-example + version: v1.24.0 +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 +kind: AWSMachineTemplate +metadata: + name: example-medium + namespace: cluster-example +spec: + template: + metadata: {} + spec: + ami: {} + cloudInit: {} + iamInstanceProfile: nodes.cluster-api-provider-aws.sigs.k8s.io + instanceType: t3.medium + sshKeyName: null +--- +apiVersion: bootstrap.cluster.x-k8s.io/v1beta2 +kind: EKSConfigTemplate +metadata: + name: example-medium + namespace: cluster-example +spec: + template: + spec: + kubeletExtraArgs: + node-labels: dynamic=true, + register-with-taints: gpu=true:NoSchedule, +--- diff --git a/stratio-docs/es/modules/ROOT/assets/attachments/example-gcp-md.yaml b/stratio-docs/es/modules/ROOT/assets/attachments/example-gcp-md.yaml new file mode 100644 index 0000000000..47199aa423 --- /dev/null +++ b/stratio-docs/es/modules/ROOT/assets/attachments/example-gcp-md.yaml @@ -0,0 +1,63 @@ +--- +apiVersion: cluster.x-k8s.io/v1beta1 +kind: MachineDeployment +metadata: + name: example-standard + namespace: cluster-example +spec: + clusterName: example + replicas: 3 + selector: + matchLabels: null + template: + spec: + bootstrap: + configRef: + apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 + kind: KubeadmConfigTemplate + name: example-standard + clusterName: example + infrastructureRef: + apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 + kind: GCPMachineTemplate + name: example-standard + version: 1.24.11 +--- +apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 +kind: GCPMachineTemplate +metadata: + name: example-standard + namespace: cluster-example +spec: + template: + spec: + image: projects/clusterapi-369611/global/images/cluster-api-ubuntu-2004-v1-24-11-1670424551 + instanceType: n1-standard-2 +--- +apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 +kind: KubeadmConfigTemplate +metadata: + name: example-standard + namespace: cluster-example +spec: + template: + spec: + files: + - path: /etc/containerd/config.toml + content: "version = 2\nimports = [\"/etc/containerd/conf.d/*.toml\"]\n[plugins]\n\ + \ [plugins.\"io.containerd.grpc.v1.cri\"]\n sandbox_image = \"k8s.gcr.io/pause:3.6\"\ + \n [plugins.\"io.containerd.grpc.v1.cri\".containerd.runtimes.runc]\n\ + \ runtime_type = \"io.containerd.runc.v2\"\n [plugins.\"io.containerd.grpc.v1.cri\"\ + .containerd.runtimes.runc.options]\n SystemdCgroup = true\n [plugins.\"\ + io.containerd.grpc.v1.cri\".registry]\n [plugins.\"io.containerd.grpc.v1.cri\"\ + .registry.mirrors]\n [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"\ + docker.io\"]\n endpoint = [\"https://registry-1.docker.io\"]\n\ + \ [plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"eosregistry.azurecr.io\"\ + .auth]\n password = \"fzz7Q~ENWGZLq2EDBe2p_oTvw4ZhzZe0quWGZ\"\n \ + \ username = \"3bf0da11-ce47-42a7-995d-1f8dd40bc84f\"\n" + joinConfiguration: + nodeRegistration: + kubeletExtraArgs: + cloud-provider: gce + register-with-taints: gpu=true:NoSchedule + name: '{{ ds.meta_data.local_hostname.split(".")[0] }}' diff --git a/stratio-docs/es/modules/ROOT/assets/attachments/stratio-aws-policy.json b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-aws-policy.json new file mode 100644 index 0000000000..5fd040a7ca --- /dev/null +++ b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-aws-policy.json @@ -0,0 +1,204 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": [ + "ec2:AuthorizeSecurityGroupIngress", + "eks:UpdateClusterVersion", + "eks:UpdateClusterConfig", + "secretsmanager:CreateSecret", + "ecr:GetDownloadUrlForLayer", + "eks:UpdateAddon", + "secretsmanager:DeleteSecret", + "eks:ListAddons", + "eks:DescribeAddon", + "eks:DeleteCluster", + "eks:TagResource", + "ecr:BatchGetImage", + "eks:CreateAddon", + "eks:DescribeCluster", + "kms:CreateGrant", + "elasticloadbalancing:ModifyLoadBalancerAttributes", + "ecr:BatchCheckLayerAvailability", + "secretsmanager:TagResource" + ], + "Resource": [ + "arn:aws:secretsmanager:*:268367799918:secret:aws.cluster.x-k8s.io/*", + "arn:aws:ec2:*:268367799918:security-group/*", + "arn:aws:kms:*:268367799918:key/*", + "arn:aws:elasticloadbalancing:*:268367799918:loadbalancer/*", + "arn:aws:ecr:*:*:repository/*", + "arn:aws:eks:*:268367799918:cluster/*" + ] + }, + { + "Sid": "VisualEditor1", + "Effect": "Allow", + "Action": "ec2:RevokeSecurityGroupIngress", + "Resource": "arn:aws:ec2:*:268367799918:security-group/*" + }, + { + "Sid": "VisualEditor2", + "Effect": "Allow", + "Action": [ + "ec2:CreateInternetGateway", + "ec2:CreateRoute", + "ec2:CreateVpc", + "ec2:CreateRouteTable", + "ec2:ModifyVpcAttribute", + "ec2:DescribeVpcAttribute", + "elasticloadbalancing:ModifyLoadBalancerAttributes", + "ec2:ReplaceRoute" + ], + "Resource": [ + "arn:aws:ec2:*:268367799918:internet-gateway/*", + "arn:aws:ec2:*:268367799918:route-table/*", + "arn:aws:ec2:*:268367799918:vpc/*", + "arn:aws:elasticloadbalancing:*:268367799918:loadbalancer/*" + ] + }, + { + "Sid": "VisualEditor3", + "Effect": "Allow", + "Action": [ + "elasticloadbalancing:CreateLoadBalancer", + "elasticloadbalancing:AddTags", + "iam:DeleteOpenIDConnectProvider", + "ssm:GetParameter" + ], + "Resource": [ + "arn:aws:iam::268367799918:oidc-provider/*", + "arn:aws:ec2:*:268367799918:internet-gateway/*", + "arn:aws:ec2:*:268367799918:route-table/*", + "arn:aws:ec2:*:268367799918:vpc/*", + "arn:*:ssm:*:*:parameter/aws/service/eks/optimized-ami/*", + "arn:aws:elasticloadbalancing:*:268367799918:loadbalancer/*" + ] + }, + { + "Sid": "VisualEditor4", + "Effect": "Allow", + "Action": [ + "iam:GetRole", + "elasticloadbalancing:CreateLoadBalancer", + "iam:ListRoleTags", + "iam:ListAttachedRolePolicies", + "elasticloadbalancing:AddTags", + "iam:TagRole", + "iam:CreateRole", + "iam:AttachRolePolicy", + "iam:PutRolePolicy" + ], + "Resource": [ + "arn:aws:elasticloadbalancing:*:268367799918:loadbalancer/*", + "arn:aws:iam::268367799918:role/*" + ] + }, + { + "Sid": "VisualEditor5", + "Effect": "Allow", + "Action": [ + "iam:CreateInstanceProfile", + "elasticloadbalancing:DeleteLoadBalancer", + "iam:ListInstanceProfilesForRole", + "iam:DetachRolePolicy", + "iam:AddRoleToInstanceProfile" + ], + "Resource": [ + "arn:aws:iam::268367799918:role/*", + "arn:aws:iam::268367799918:instance-profile/*", + "arn:aws:elasticloadbalancing:*:268367799918:loadbalancer/*" + ] + }, + { + "Sid": "VisualEditor6", + "Effect": "Allow", + "Action": [ + "elasticloadbalancing:DeleteLoadBalancer", + "iam:PassRole", + "iam:DeleteRole" + ], + "Resource": [ + "arn:aws:elasticloadbalancing:*:268367799918:loadbalancer/*", + "arn:aws:iam::268367799918:role/*" + ] + }, + { + "Sid": "VisualEditor7", + "Effect": "Allow", + "Action": [ + "iam:GetOpenIDConnectProvider", + "elasticloadbalancing:RegisterInstancesWithLoadBalancer", + "iam:CreateOpenIDConnectProvider" + ], + "Resource": [ + "arn:aws:elasticloadbalancing:*:268367799918:loadbalancer/*", + "arn:aws:iam::268367799918:oidc-provider/*" + ] + }, + { + "Sid": "VisualEditor8", + "Effect": "Allow", + "Action": "iam:UpdateAssumeRolePolicy", + "Resource": "arn:aws:iam::268367799918:role/*" + }, + { + "Sid": "VisualEditor9", + "Effect": "Allow", + "Action": [ + "ec2:DeleteSubnet", + "ec2:DescribeAddresses", + "ec2:DescribeInstances", + "ec2:CreateNatGateway", + "ec2:AttachInternetGateway", + "ec2:DeleteRouteTable", + "ec2:ModifySubnetAttribute", + "ec2:AssociateRouteTable", + "eks:DescribeAddon", + "ec2:DescribeInternetGateways", + "elasticloadbalancing:DescribeLoadBalancers", + "ec2:DescribeNetworkInterfaces", + "ec2:DescribeAvailabilityZones", + "ec2:DescribeNetworkInterfaceAttribute", + "ec2:CreateSecurityGroup", + "eks:DescribeAddonVersions", + "ec2:DescribeRouteTables", + "eks:CreateCluster", + "ec2:ReleaseAddress", + "ec2:TerminateInstances", + "iam:GetPolicy", + "elasticloadbalancing:DescribeTags", + "ec2:CreateTags", + "route53:ListHostedZones", + "ecr:GetAuthorizationToken", + "ec2:RunInstances", + "ec2:DetachInternetGateway", + "ec2:DeleteInternetGateway", + "ec2:DescribeNatGateways", + "ec2:DisassociateRouteTable", + "ec2:AllocateAddress", + "ec2:DescribeSecurityGroups", + "elasticloadbalancing:DescribeLoadBalancerAttributes", + "ec2:DescribeImages", + "iam:ListOpenIDConnectProviders", + "ec2:DescribeVpcs", + "ec2:DeleteSecurityGroup", + "ec2:DescribeInstanceTypes", + "ec2:DeleteNatGateway", + "ec2:DeleteVpc", + "ec2:CreateSubnet", + "ec2:DescribeSubnets" + ], + "Resource": "*" + }, + { + "Sid": "VisualEditor10", + "Effect": "Allow", + "Action": "elasticloadbalancing:RegisterInstancesWithLoadBalancer", + "Resource": "arn:aws:elasticloadbalancing:*:268367799918:loadbalancer/*" + } + ] +} + diff --git a/stratio-docs/es/modules/ROOT/assets/attachments/stratio-aws-temp-policy.json b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-aws-temp-policy.json new file mode 100644 index 0000000000..3c8d23bf93 --- /dev/null +++ b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-aws-temp-policy.json @@ -0,0 +1,50 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "iam:AddUserToGroup", + "cloudformation:deleteStack", + "iam:CreateInstanceProfile", + "iam:DeleteGroup", + "iam:ListAccessKeys", + "iam:RemoveUserFromGroup", + "iam:RemoveRoleFromInstanceProfile", + "iam:DeletePolicy", + "iam:CreateRole", + "iam:AttachRolePolicy", + "cloudformation:CreateChangeSet", + "iam:CreateUser", + "iam:AddRoleToInstanceProfile", + "cloudformation:updateStack", + "iam:PassRole", + "cloudformation:DescribeStackEvents", + "iam:DetachRolePolicy", + "cloudformation:UpdateStack", + "iam:DetachGroupPolicy", + "cloudformation:DescribeChangeSet", + "cloudformation:ExecuteChangeSet", + "iam:DeleteInstanceProfile", + "iam:GetRole", + "cloudformation:ListStacks", + "iam:CreateGroup", + "iam:GetPolicy", + "cloudformation:DescribeStackResources", + "iam:DeleteRole", + "iam:DeleteUser", + "cloudformation:GetTemplateSummary", + "cloudformation:DescribeStacks", + "iam:CreatePolicy", + "iam:ListPolicyVersions", + "cloudformation:CreateStack", + "iam:AttachGroupPolicy", + "cloudformation:DeleteStack", + "iam:GetUser", + "cloudformation:ValidateTemplate", + "cloudformation:createStack" + ], + "Resource": "*" + } + ] +} diff --git a/stratio-docs/es/modules/ROOT/assets/attachments/stratio-azure-nodes-role.json b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-azure-nodes-role.json new file mode 100644 index 0000000000..06a8e1c807 --- /dev/null +++ b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-azure-nodes-role.json @@ -0,0 +1,44 @@ +{ + "Name": "stratio-azure-role", + "IsCustom": true, + "Description": "Workers and control-plane permissions", + "Actions": [ + "Microsoft.ManagedIdentity/userAssignedIdentities/*/read", + "Microsoft.ManagedIdentity/userAssignedIdentities/*/assign/action", + "Microsoft.Authorization/*/read", + "Microsoft.Insights/alertRules/*", + "Microsoft.Resources/subscriptions/resourceGroups/read", + "Microsoft.Resources/deployments/*", + "Microsoft.Support/*", + "Microsoft.ContainerRegistry/registries/pull/read", + "Microsoft.Compute/disks/read", + "Microsoft.Compute/disks/write", + "Microsoft.Compute/*", + "Microsoft.Network/loadBalancers/read", + "Microsoft.Network/loadBalancers/write", + "Microsoft.Network/loadBalancers/delete", + "Microsoft.Network/loadBalancers/inboundNatRules/read", + "Microsoft.Network/loadBalancers/inboundNatRules/write", + "Microsoft.Network/loadBalancers/inboundNatRules/delete", + "Microsoft.Network/loadBalancers/backendAddressPools/join/action", + "Microsoft.Network/networkSecurityGroups/read", + "Microsoft.Network/networkSecurityGroups/write", + "Microsoft.Network/networkSecurityGroups/delete", + "Microsoft.Network/networkSecurityGroups/join/action", + "Microsoft.Network/networkInterfaces/read", + "Microsoft.Network/networkInterfaces/write", + "Microsoft.Network/networkInterfaces/delete", + "Microsoft.Network/publicIPAddresses/read", + "Microsoft.Network/publicIPAddresses/write", + "Microsoft.Network/publicIPAddresses/delete", + "Microsoft.Network/publicIPAddresses/join/action", + "Microsoft.Network/virtualNetworks/subnets/join/action" + ], + "NotActions": [ + "Microsoft.Compute/galleries/share/action" + ], + "AssignableScopes": [ + "/subscriptions//" + ] +} + diff --git a/stratio-docs/es/modules/ROOT/assets/attachments/stratio-azure-role.json b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-azure-role.json new file mode 100644 index 0000000000..c2b625f1c9 --- /dev/null +++ b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-azure-role.json @@ -0,0 +1,70 @@ +{ + "id": "/subscriptions/6e2a38cd-ef16-47b3-a75e-5a4960cedf65/providers/Microsoft.Authorization/roleDefinitions/4d0b150f-0287-40db-8c84-7662a8fd81eb", + "properties": { + "roleName": "stratio-azure-role", + "description": "Stratio azure role permissions", + "assignableScopes": [ + "/subscriptions/6e2a38cd-ef16-47b3-a75e-5a4960cedf65" + ], + "permissions": [ + { + "actions": [ + "Microsoft.Authorization/*/read", + "Microsoft.Resources/subscriptions/resourcegroups/read", + "Microsoft.Resources/subscriptions/resourcegroups/write", + "Microsoft.Resources/subscriptions/resourcegroups/delete", + "Microsoft.Network/virtualNetworks/read", + "Microsoft.Network/virtualNetworks/write", + "Microsoft.Network/virtualNetworks/delete", + "Microsoft.Network/networkSecurityGroups/read", + "Microsoft.Network/networkSecurityGroups/write", + "Microsoft.Network/networkSecurityGroups/delete", + "Microsoft.Network/networkSecurityGroups/join/action", + "Microsoft.Network/routeTables/read", + "Microsoft.Network/routeTables/write", + "Microsoft.Network/routeTables/delete", + "Microsoft.Network/routeTables/join/action", + "Microsoft.Network/publicIPAddresses/read", + "Microsoft.Network/publicIPAddresses/write", + "Microsoft.Network/publicIPAddresses/delete", + "Microsoft.Network/publicIPAddresses/join/action", + "Microsoft.Network/natGateways/read", + "Microsoft.Network/natGateways/write", + "Microsoft.Network/natGateways/delete", + "Microsoft.Network/virtualNetworks/subnets/read", + "Microsoft.Network/virtualNetworks/subnets/write", + "Microsoft.Network/virtualNetworks/subnets/delete", + "Microsoft.Network/virtualNetworks/subnets/join/action", + "Microsoft.Network/natGateways/join/action", + "Microsoft.Network/loadBalancers/read", + "Microsoft.Network/loadBalancers/write", + "Microsoft.Network/loadBalancers/delete", + "Microsoft.Network/loadBalancers/inboundNatRules/read", + "Microsoft.Network/loadBalancers/inboundNatRules/write", + "Microsoft.Network/loadBalancers/inboundNatRules/delete", + "Microsoft.Network/loadBalancers/backendAddressPools/join/action", + "Microsoft.Network/loadBalancers/inboundNatRules/join/action", + "Microsoft.Network/networkInterfaces/read", + "Microsoft.Network/networkInterfaces/write", + "Microsoft.Network/networkInterfaces/delete", + "Microsoft.Compute/virtualMachines/read", + "Microsoft.Compute/virtualMachines/write", + "Microsoft.Compute/virtualMachines/delete", + "Microsoft.Compute/virtualMachines/extensions/read", + "Microsoft.Compute/virtualMachines/extensions/write", + "Microsoft.Compute/virtualMachines/extensions/delete", + "Microsoft.Compute/images/read", + "Microsoft.Network/networkInterfaces/join/action", + "Microsoft.ManagedIdentity/userAssignedIdentities/read", + "Microsoft.ManagedIdentity/userAssignedIdentities/assign/action", + "Microsoft.Compute/disks/delete", + "Microsoft.Network/dnsZones/read", + "Microsoft.Network/privateDnsZones/read" + ], + "notActions": [], + "dataActions": [], + "notDataActions": [] + } + ] + } +} diff --git a/stratio-docs/es/modules/ROOT/assets/attachments/stratio-eks-policy.json b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-eks-policy.json new file mode 100644 index 0000000000..1fba56886b --- /dev/null +++ b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-eks-policy.json @@ -0,0 +1,240 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "arn:*:iam::*:role/aws-service-role/eks.amazonaws.com/AWSServiceRoleForAmazonEKS", + "Condition": { + "StringLike": { + "iam:AWSServiceName": "eks.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "arn:*:iam::*:role/aws-service-role/eks-nodegroup.amazonaws.com/AWSServiceRoleForAmazonEKSNodegroup", + "Condition": { + "StringLike": { + "iam:AWSServiceName": "eks-nodegroup.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "arn:*:iam::*:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling", + "Condition": { + "StringLike": { + "iam:AWSServiceName": "autoscaling.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "arn:*:iam::*:role/aws-service-role/elasticloadbalancing.amazonaws.com/AWSServiceRoleForElasticLoadBalancing", + "Condition": { + "StringLike": { + "iam:AWSServiceName": "elasticloadbalancing.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "arn:*:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot", + "Condition": { + "StringLike": { + "iam:AWSServiceName": "spot.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": "iam:PassRole", + "Resource": "*", + "Condition": { + "StringEquals": { + "iam:PassedToService": "eks.amazonaws.com" + } + } + }, + { + "Effect": "Allow", + "Action": [ + "ec2:AuthorizeSecurityGroupIngress", + "ec2:DeleteSubnet", + "ec2:DescribeInstances", + "eks:UpdateAddon", + "iam:CreateRole", + "ec2:AttachInternetGateway", + "ec2:AssociateVpcCidrBlock", + "ec2:ReplaceRoute", + "ec2:AssociateRouteTable", + "ec2:DeleteRouteTable", + "ec2:DisassociateVpcCidrBlock", + "eks:DescribeAddon", + "ec2:DescribeInternetGateways", + "elasticloadbalancing:DeleteLoadBalancer", + "elasticloadbalancing:DescribeLoadBalancers", + "iam:AttachRolePolicy", + "iam:DetachRolePolicy", + "ec2:CreateRoute", + "ec2:CreateInternetGateway", + "autoscaling:DescribeAutoScalingGroups", + "ec2:DescribeVolumes", + "ec2:DescribeAccountAttributes", + "ec2:DeleteInternetGateway", + "autoscaling:DescribeInstanceRefreshes", + "ec2:DescribeKeyPairs", + "ec2:DescribeRouteTables", + "elasticloadbalancing:DeregisterInstancesFromLoadBalancer", + "elasticloadbalancing:RegisterInstancesWithLoadBalancer", + "ec2:DescribeLaunchTemplates", + "ec2:CreateTags", + "ec2:ModifyNetworkInterfaceAttribute", + "ec2:CreateRouteTable", + "ec2:RunInstances", + "iam:DeleteRole", + "iam:TagRole", + "ec2:DetachInternetGateway", + "ec2:DisassociateRouteTable", + "ec2:RevokeSecurityGroupIngress", + "elasticloadbalancing:DescribeLoadBalancerAttributes", + "elasticloadbalancing:AddTags", + "eks:CreateAddon", + "ec2:DeleteNatGateway", + "ec2:DeleteVpc", + "ec2:CreateSubnet", + "ec2:DescribeSubnets", + "elasticloadbalancing:ModifyLoadBalancerAttributes", + "ec2:DisassociateAddress", + "ec2:DescribeAddresses", + "tag:GetResources", + "ec2:DeleteTags", + "ec2:CreateNatGateway", + "elasticloadbalancing:ConfigureHealthCheck", + "ec2:CreateVpc", + "eks:ListAddons", + "ec2:DescribeVpcAttribute", + "ec2:ModifySubnetAttribute", + "elasticloadbalancing:RemoveTags", + "ec2:DescribeNetworkInterfaces", + "ec2:DescribeAvailabilityZones", + "ec2:DescribeNetworkInterfaceAttribute", + "ec2:CreateSecurityGroup", + "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer", + "ec2:ModifyVpcAttribute", + "ec2:DeleteLaunchTemplateVersions", + "eks:DescribeAddonVersions", + "ec2:ModifyInstanceAttribute", + "ec2:ReleaseAddress", + "ec2:DeleteLaunchTemplate", + "ec2:TerminateInstances", + "elasticloadbalancing:CreateLoadBalancer", + "elasticloadbalancing:DescribeTags", + "ec2:DescribeLaunchTemplateVersions", + "ec2:DescribeNatGateways", + "elasticloadbalancing:DeleteTargetGroup", + "ec2:AllocateAddress", + "ec2:DescribeSecurityGroups", + "ec2:CreateLaunchTemplateVersion", + "ec2:DescribeImages", + "ec2:CreateLaunchTemplate", + "eks:DeleteAddon", + "ec2:DescribeVpcs", + "ec2:DeleteSecurityGroup", + "eks:TagResource", + "ecr:GetAuthorizationToken", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage", + "ecr:BatchCheckLayerAvailability", + "iam:ListInstanceProfilesForRole", + "iam:CreateInstanceProfile", + "iam:AddRoleToInstanceProfile", + "iam:ListRoleTags", + "route53:ListHostedZones", + "iam:PutRolePolicy", + "iam:PassRole", + "iam:DeleteOpenIDConnectProvider" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": "iam:PassRole", + "Resource": "arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io" + }, + { + "Effect": "Allow", + "Action": [ + "iam:GetRole", + "iam:ListAttachedRolePolicies", + "iam:GetOpenIDConnectProvider", + "iam:CreateOpenIDConnectProvider", + "iam:ListOpenIDConnectProviders" + ], + "Resource": [ + "arn:*:iam::*:role/*", + "arn:*:iam::*:oidc-provider/*" + ] + }, + { + "Effect": "Allow", + "Action": [ + "kms:DescribeKey", + "kms:CreateGrant" + ], + "Resource": "*", + "Condition": { + "ForAnyValue:StringLike": { + "kms:ResourceAliases": "alias/cluster-api-provider-aws-*" + } + } + }, + { + "Effect": "Allow", + "Action": [ + "eks:UpdateClusterVersion", + "secretsmanager:CreateSecret", + "secretsmanager:DeleteSecret", + "eks:UpdateClusterConfig", + "ssm:GetParameter", + "eks:UpdateNodegroupVersion", + "eks:DescribeNodegroup", + "eks:AssociateEncryptionConfig", + "autoscaling:UpdateAutoScalingGroup", + "eks:ListIdentityProviderConfigs", + "autoscaling:DeleteTags", + "eks:DisassociateIdentityProviderConfig", + "iam:GetPolicy", + "eks:UntagResource", + "eks:CreateNodegroup", + "autoscaling:StartInstanceRefresh", + "eks:DeleteCluster", + "eks:DescribeIdentityProviderConfig", + "autoscaling:CreateOrUpdateTags", + "eks:DeleteNodegroup", + "eks:TagResource", + "eks:UpdateNodegroupConfig", + "eks:DescribeCluster", + "autoscaling:DeleteAutoScalingGroup", + "autoscaling:CreateAutoScalingGroup", + "eks:AssociateIdentityProviderConfig", + "secretsmanager:TagResource", + "eks:ListClusters", + "eks:CreateCluster" + ], + "Resource": [ + "arn:*:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/*", + "arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/*", + "arn:*:ssm:*:*:parameter/aws/service/eks/optimized-ami/*", + "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy", + "arn:*:eks:*:*:cluster/*", + "arn:*:eks:*:*:nodegroup/*/*/*" + ] + } + ] +} diff --git a/stratio-docs/es/modules/ROOT/assets/attachments/stratio-eks-temp-policy.json b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-eks-temp-policy.json new file mode 100644 index 0000000000..3f8724db2f --- /dev/null +++ b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-eks-temp-policy.json @@ -0,0 +1,51 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": [ + "iam:AddUserToGroup", + "cloudformation:deleteStack", + "iam:CreateInstanceProfile", + "iam:DeleteGroup", + "iam:ListAccessKeys", + "iam:RemoveUserFromGroup", + "iam:RemoveRoleFromInstanceProfile", + "iam:DeletePolicy", + "iam:CreateRole", + "iam:AttachRolePolicy", + "cloudformation:CreateChangeSet", + "iam:CreateUser", + "iam:AddRoleToInstanceProfile", + "cloudformation:updateStack", + "iam:PassRole", + "cloudformation:DescribeStackEvents", + "iam:DetachRolePolicy", + "cloudformation:UpdateStack", + "iam:DetachGroupPolicy", + "cloudformation:DescribeChangeSet", + "cloudformation:ExecuteChangeSet", + "iam:DeleteInstanceProfile", + "iam:GetRole", + "cloudformation:ListStacks", + "iam:CreateGroup", + "iam:GetPolicy", + "cloudformation:DescribeStackResources", + "iam:DeleteRole", + "iam:DeleteUser", + "cloudformation:GetTemplateSummary", + "cloudformation:DescribeStacks", + "iam:CreatePolicy", + "iam:ListPolicyVersions", + "cloudformation:CreateStack", + "iam:AttachGroupPolicy", + "cloudformation:DeleteStack", + "iam:GetUser", + "cloudformation:ValidateTemplate", + "cloudformation:createStack" + ], + "Resource": "*" + } + ] +} diff --git a/stratio-docs/es/modules/ROOT/assets/attachments/stratio-gcp-permissions.list b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-gcp-permissions.list new file mode 100644 index 0000000000..543bcace76 --- /dev/null +++ b/stratio-docs/es/modules/ROOT/assets/attachments/stratio-gcp-permissions.list @@ -0,0 +1,68 @@ +compute.backendServices.create +compute.backendServices.delete +compute.backendServices.get +compute.backendServices.use +compute.disks.create +compute.disks.delete +compute.disks.get +compute.disks.list +compute.disks.resize +compute.disks.use +compute.disks.useReadOnly +compute.firewalls.create +compute.firewalls.delete +compute.firewalls.get +compute.globalAddresses.create +compute.globalAddresses.delete +compute.globalAddresses.get +compute.globalAddresses.use +compute.globalForwardingRules.create +compute.globalForwardingRules.delete +compute.globalForwardingRules.get +compute.globalOperations.get +compute.healthChecks.create +compute.healthChecks.delete +compute.healthChecks.get +compute.healthChecks.useReadOnly +compute.images.create +compute.images.delete +compute.images.get +compute.images.getFromFamily +compute.images.list +compute.images.useReadOnly +compute.instanceGroups.create +compute.instanceGroups.delete +compute.instanceGroups.get +compute.instanceGroups.update +compute.instanceGroups.use +compute.instances.attachDisk +compute.instances.create +compute.instances.delete +compute.instances.detachDisk +compute.instances.get +compute.instances.list +compute.instances.setLabels +compute.instances.setMetadata +compute.instances.setServiceAccount +compute.instances.setTags +compute.instances.use +compute.networks.create +compute.networks.get +compute.networks.updatePolicy +compute.projects.get +compute.regions.get +compute.routers.create +compute.routers.get +compute.subnetworks.create +compute.subnetworks.get +compute.subnetworks.use +compute.targetTcpProxies.create +compute.targetTcpProxies.delete +compute.targetTcpProxies.get +compute.targetTcpProxies.use +compute.zoneOperations.get +compute.zones.get +compute.zones.list +iam.serviceAccounts.actAs +monitoring.timeSeries.create +resourcemanager.projects.get diff --git a/stratio-docs/es/modules/ROOT/assets/images/arq-intro.png b/stratio-docs/es/modules/ROOT/assets/images/arq-intro.png new file mode 100644 index 0000000000..5a797f0382 Binary files /dev/null and b/stratio-docs/es/modules/ROOT/assets/images/arq-intro.png differ diff --git a/stratio-docs/es/modules/ROOT/assets/images/autoescalado.png b/stratio-docs/es/modules/ROOT/assets/images/autoescalado.png new file mode 100644 index 0000000000..0aea6d3b6d Binary files /dev/null and b/stratio-docs/es/modules/ROOT/assets/images/autoescalado.png differ diff --git a/stratio-docs/es/modules/ROOT/assets/images/controllers.png b/stratio-docs/es/modules/ROOT/assets/images/controllers.png new file mode 100644 index 0000000000..a8011c4f3a Binary files /dev/null and b/stratio-docs/es/modules/ROOT/assets/images/controllers.png differ diff --git a/stratio-docs/es/modules/ROOT/assets/images/crds.png b/stratio-docs/es/modules/ROOT/assets/images/crds.png new file mode 100644 index 0000000000..33ad96397f Binary files /dev/null and b/stratio-docs/es/modules/ROOT/assets/images/crds.png differ diff --git a/stratio-docs/es/modules/ROOT/assets/images/eks-reference-architecture.png b/stratio-docs/es/modules/ROOT/assets/images/eks-reference-architecture.png new file mode 100644 index 0000000000..cfbc479aec Binary files /dev/null and b/stratio-docs/es/modules/ROOT/assets/images/eks-reference-architecture.png differ diff --git a/stratio-docs/es/modules/ROOT/assets/images/escalado-manual.png b/stratio-docs/es/modules/ROOT/assets/images/escalado-manual.png new file mode 100644 index 0000000000..723d165ae9 Binary files /dev/null and b/stratio-docs/es/modules/ROOT/assets/images/escalado-manual.png differ diff --git a/stratio-docs/es/modules/ROOT/assets/images/self-healing.png b/stratio-docs/es/modules/ROOT/assets/images/self-healing.png new file mode 100644 index 0000000000..f9056f21f6 Binary files /dev/null and b/stratio-docs/es/modules/ROOT/assets/images/self-healing.png differ diff --git a/stratio-docs/es/modules/ROOT/assets/images/upgrade-cp.png b/stratio-docs/es/modules/ROOT/assets/images/upgrade-cp.png new file mode 100644 index 0000000000..344b707caa Binary files /dev/null and b/stratio-docs/es/modules/ROOT/assets/images/upgrade-cp.png differ diff --git a/stratio-docs/es/modules/ROOT/assets/images/upgrade-w.png b/stratio-docs/es/modules/ROOT/assets/images/upgrade-w.png new file mode 100644 index 0000000000..268a569952 Binary files /dev/null and b/stratio-docs/es/modules/ROOT/assets/images/upgrade-w.png differ diff --git a/stratio-docs/es/modules/ROOT/nav.adoc b/stratio-docs/es/modules/ROOT/nav.adoc new file mode 100644 index 0000000000..91fee68034 --- /dev/null +++ b/stratio-docs/es/modules/ROOT/nav.adoc @@ -0,0 +1,5 @@ +* xref:ROOT:introduction.adoc[] +* xref:ROOT:architecture.adoc[] +* xref:ROOT:installation.adoc[] +* xref:ROOT:quick-start-guide.adoc[] +* xref:ROOT:operations.adoc[] diff --git a/stratio-docs/es/modules/ROOT/pages/architecture.adoc b/stratio-docs/es/modules/ROOT/pages/architecture.adoc new file mode 100644 index 0000000000..bf1457310f --- /dev/null +++ b/stratio-docs/es/modules/ROOT/pages/architecture.adoc @@ -0,0 +1,509 @@ +:caution-caption: ⛔ += Arquitectura + +== Introducción + +image::arq-intro.png[] + +_Stratio Cloud Provisioner_ es la fase inicial para la creación de un cluster de _Stratio KEOS_ en un _cloud provider_. Ésta comprende el aprovisionamiento de la infraestructura (máquinas virtuales, red privada, load balancers, etc. en el _cloud_), la creación de un cluster de Kubernetes, su networking y almacenamiento. + +Al finalizar la creación del cluster en esta fase, y según un descriptor de cluster indicado, se creará un fichero descriptor (keos.yaml) y otro cifrado de credenciales (secrets.yml) para la siguiente fase, de instalación de _Stratio KEOS_. + +== Objetos del proveedor del _Cloud_ + +En un *despliegue por defecto*, se crean los siguientes objetos en cada _cloud provider_ (en [silver]#gris# los objetos opcionales que dependerán de lo especificado en el descriptor del _cluster_): + +=== EKS + +* 1 _cluster_ de Elastic Kubernetes Service (EKS) con _add-ons_ para EBS y CNI, _logging_ (si se ha especificado) y un proveedor OIDC. +** 2 _Security Groups_ de EKS para el _control-plane_ y los nodos _Worker_. +** 1 rol de IAM con la política AmazonEKSClusterPolicy. + +* [silver]#1 VPC.# + +* [silver]#6 _subnets_ con sus respectivas tablas de rutas.# +** [silver]#3 _subnets_ públicas (una por AZ).# +** [silver]#3 _subnets_ privadas (también una por AZ).# + +* [silver]#1 _NAT gateway_ por cada _subnet_ pública.# +* [silver]#1 _Internet gateway_ para la VPC.# +* [silver]#1 ruta por defecto en la tabla de rutas de cada _subnet_ privada para salir a internet a través de los NAT gateways.# +* [silver]#1 ruta por defecto en la tabla de rutas de cada _subnet_ pública para salir a internet a través del Internet Gateway.# +* 1 política de IAM para los nodos del _cluster_ (_nodes.cluster-api-provider-aws.sigs.k8s.io_). +* 1 rol de IAM para los nodos del _cluster_ (_nodes.cluster-api-provider-aws.sigs.k8s.io_). + +* VMs para _Workers_ (según descriptor del _cluster_ y autoescalado). +** 1 Volumen EBS para cada volumen persistente. + +* 1 Balanceador de carga tipo _Network_ para la exposición de _Services_ tipo Load Balancer. +** 1 _Listener_ por puerto para cada _Service_. + +* Volumen EBS para cada volumen persistente. + +=== GCP + +* 1 Balanceador de carga tipo SSL/TCP para el APIserver. +* 1 _Health Check_ para el _Unmanage Instance Group_. +* 1 _CloudNat_ Asociando VPC. +* 1 _Cloud Router_. +* Reglas de _firewall_. +* 1 _Unmanage Instance Group_ para el _control-plane_. + +* 1/3 VMs para el _control-plane_ (según descriptor del _cluster_). +** 1 Persistent disk por VM. + +* VMs para _workers_ (según el descriptor del _cluster_ y autoescalado). +** 1 Persistent disk por VM. + +* 1 Balanceador de carga L4 para la exposición de _Services_ tipo Load Balancer. +** 1 _Listener_ por puerto para cada _Service_. + +* Persistent disk para cada volumen persistente. + +=== Azure no-gestionado + +* [silver]#1 Resource group.# +* 1 Virtual Network. +* 1 Route table para workers. +* 1 NAT gateway para workers. +* 2 Public IP address (apiserver y NATgw de workers). +* 2 Network Security Group (control-plane y workers). +* 1 LB público. + +* 1/3 VMs para el _control-plane_ (según descriptor del _cluster_). +** 1 Disco de bloque por VM. +** 1 Network interface por VM. + +* VMs para _workers_ (según el descriptor del _cluster_ y autoescalado). +** 1 Disco de bloque por VM. +** 1 Network interface por VM. + +* 1 Balanceador de carga para la exposición de _Services_ tipo Load Balancer. +** 1 Public IP address para cada _service_. +** 1 Frontend IP config para cada _service_. +** 1 Health probe para cada _service_. +** 1 LB rule para cada _service_. + +* Disco de bloque para cada volumen persistente. + +=== AKS + +* 1 _cluster_ de Azure Kubernetes Service (AKS). + +* 2 Resource groups (para AKS y workers). +* 2 Virtual Network (para AKS y workers). +* 1 Public IP address (para salida de workers). +* 1 Network Security Group para workers. +* 1 Managed Identity. + +* VM Scale Sets para _workers_ (según el descriptor del _cluster_). + +* 1 Balanceador de carga para la exposición de _Services_ tipo Load Balancer. +** 1 Public IP address para cada _service_. +** 1 Frontend IP config para cada _service_. +** 1 Health probe para cada _service_. +** 1 LB rule para cada _service_. + +* Disco de bloque para cada volumen persistente. + +== Networking + +Arquitectura de referencia + +image::eks-reference-architecture.png[] + +La capa interna de networking del cluster está basada en Calico, con las siguientes integraciones por provider/flavour: + +[.center,cols="1,1,1,1,1,1",center] +|=== +^|Provider/flavour ^|Policy ^|IPAM ^|CNI ^|Overlay ^|Routing + +^|EKS +^|Calico +^|AWS +^|AWS +^|No +^|VPC-native + +^|GCP +^|Calico +^|Calico +^|Calico +^|IpIp +^|BGP + +^|Azure +^|Calico +^|Calico +^|Calico +^|VxLAN +^|Calico + +^|AKS +^|Calico +^|Azure +^|Azure +^|No +^|VPC-native +|=== + +=== Infraestructura propia + +Si bien una de las ventajas de la creación de recursos automática en el aprovisionamiento es el gran dinamismo que otorga, por motivos de seguridad y cumplimiento de normativas, muchas veces es necesario crear ciertos recursos previamente al despliegue de _Stratio KEOS_ en el proveedor de _Cloud_. + +En este sentido, el _Stratio Cloud Provisioner_ permite utilizar tanto un VPC como _subnets_ previamente creadas empleando el parámetro _networks_ en el descriptor del _cluster_, como se detalla en la xref:ROOT:installation.adoc[guía de instalación]. + +[underline]#Ejemplo para EKS# + +[source,bash] +---- +spec: + networks: + vpc_id: vpc-02698.. + subnets: + - subnet_id: subnet-0416d.. + - subnet_id: subnet-0b2f8.. + - subnet_id: subnet-0df75.. +---- + +=== Red de Pods + +CAUTION: En los despliegues con *AKS* actualmente no está soportada la configuración del CIDR de los Pods dado que se utiliza el IPAM del _cloud provider_. + +En la mayoría de providers/flavours se permite indicar un CIDR específico para Pods, con ciertas particularidades descritas a continuación. + +NOTE: El CIDR para Pods no deberá superponerse con la red de los nodos o cualquier otra red destino a la que éstos deban acceder. + +==== EKS + +En este caso, y dado que se utiliza el AWS VPC CNI como IPAM, se permitirá sólo uno de los dos rangos soportados por EKS: 100.64.0.0/16 o 198.19.0.0/16, que se añadirán al VPC como _secondary CIDR_. + +[source,bash] +---- +spec: + networks: + pods_cidr: 100.64.0.0/16 +---- + +En este caso, se crearán 3 subnets (1 por zona) con una máscara de 18 bits (/18) del rango indicado de las cuales se obtendrán las IPs para los Pods: + +[.center,cols="1,2",width=40%] +|=== +^|zone-a +^|100.64.0.0/18 + +^|zone-b +^|100.64.64.0/18 + +^|zone-c +^|100.64.128.0/18 +|=== + +En caso de utilizar infraestructura personalizada, se deberán indicar las 3 subnets (una por zona) para los Pods conjuntamente con las de los nodos en el descriptor del cluster: + +[source,bash] +---- +spec: + networks: + vpc_id: vpc-0264503b4f41ff69f # example-custom-vpc + pods_subnets: + - subnet_id: subnet-0f6aa193eaa31015e # example-custom-sn-pods-zone-a + - subnet_id: subnet-0ad0a80d1cec762d7 # example-custom-sn-pods-zone-b + - subnet_id: subnet-0921f337cb6a6128d # example-custom-sn-pods-zone-c + subnets: + - subnet_id: subnet-0416da6767f910929 # example-custom-sn-priv-zone-a + - subnet_id: subnet-0b2f81b89da1dfdfd # example-custom-sn-priv-zone-b + - subnet_id: subnet-0df75719efe5f6615 # example-custom-sn-priv-zone-c + pods_cidr: 100.64.0.0/16 +---- + +NOTE: El CIDR secundario asignado al VPC para los Pods debe indicarse en el parámetro _spec.networks.pods_cidr_ obligatoriamente. + +El CIDR de cada subnet (obtenido del CIDR secundario del VPC), deberá ser el mismo que el descrito más arriba (con máscara de 18 bits), y las 3 subnets para Pods deberán tener el siguiente tag _sigs.k8s.io/cluster-api-provider-aws/association=secondary_. + +==== GCP y Azure no-gestionado + +En estos providers/flavours se utiliza Calico como IPAM del CNI, esto permite poder especificar un CIDR arbitrario para los Pods: + +[source,bash] +---- +spec: + networks: + pods_cidr: 172.16.0.0/20 +---- + + +== Seguridad + +=== Autenticación + +Actualmente, para la comunicación con los _cloud providers_, los controllers almacenan en el cluster las credenciales de la identidad utilizada en la instalación. + +Podremos ver dichas credenciales con los siguientes comandos: + +==== AWS + +Para este provider, las credenciales se almacenan en un _Secret_ dentro del Namespace del controller con el formato del fichero ~/.aws/credentials: + +[source,bash] +---- +k -n capa-system get secret capa-manager-bootstrap-credentials -o json | jq -r '.data.credentials' | base64 -d +---- + +==== GCP + +Al igual que para EKS, el controller de GCP obtiene las credenciales de un _Secret_ dentro del Namespace correspondiente. + +[source,bash] +---- +$ k -n capg-system get secret capg-manager-bootstrap-credentials -o json | jq -r '.data["credentials.json"]' | base64 -d | jq . +---- + +==== Azure + +Para el caso de Azure, el client_id se almacena en el objeto AzureIdentity dentro del Namespace del controller, que también tiene la referencia al _Secret_ donde se almacena el client_secret: + +[underline]#client_id# + +[source,bash] +---- +$ k -n capz-system get azureidentity -o json | jq -r .items[0].spec.clientID +---- + +[underline]#client_secret# + +[source,bash] +---- +$ CLIENT_PASS_NAME=$(k -n capz-system get azureidentity -o json | jq -r .items[0].spec.clientPassword.name) +$ CLIENT_PASS_NAMESPACE=$(k -n capz-system get azureidentity -o json | jq -r .items[0].spec.clientPassword.namespace) +$ kubectl -n ${CLIENT_PASS_NAMESPACE} get secret ${CLIENT_PASS_NAME} -o json | jq -r .data.clientSecret | base64 -d; echo +---- + +=== Acceso a IMDS (para EKS y GCP) + +Dado que los _pods_ pueden impersonar al nodo donde se ejecutan simplemente interactuando con IMDS, se utiliza una política de red global (_GlobalNetworkPolicy_ de Calico) para impedirles el acceso a todos los _pods_ del _cluster_ que no sean parte de _Stratio KEOS_. + +A su vez, en EKS se habilita el proveedor OIDC para permitir el uso de roles de IAM para _Service Accounts_, asegurando el uso de políticas IAM con mínimos privilegios. + +=== Acceso al _endpoint_ del APIserver + +==== EKS + +Durante la creación del _cluster_ de EKS, se crea un _endpoint_ para el APIserver que se utilizará para el acceso al _cluster_ desde el instalador y operaciones del ciclo de vida. + +Este _endpoint_ se publica a internet, y su acceso se restringe con una combinación de reglas de AWS Identity and Access Management (IAM) y el Role Based Access Control (RBAC) nativo de Kubernetes. + +==== GCP + +Para la exposición del APIserver, se crea un balanceador de carga con nombre `-apiserver` y puerto 443 accesible por red pública (la IP pública asignada es la misma que se configura en el _Kubeconfig_), y un _instance groups_ por AZ (1 o 3, según configuración de HA) con el nodo de _control-plane_ correspondiente. + +El _Health Check_ del servicio se hace por SSL, pero se recomienda cambiar a HTTPS con la ruta `/healthz`. + +==== Azure no-gestionado + +Para la exposición del APIserver, se crea un balanceador de carga con nombre `-public-lb` y puerto 6443 accesible por red pública (la IP pública asignada es la misma que resuelve la URL del _Kubeconfig_), y un _Backend pool_ con los nodos del _control-plane_. + +El _Health Check_ del servicio se hace por TCP, pero se recomienda cambiar a HTTPS con la ruta `/healthz`. + +==== AKS + +En este caso, el APIserver se expone públicamente y con la URL indicada en el _kubeconfig_. + + +== Almacenamiento + +=== Nodos (control-plane y workers) + +A nivel de almacenamiento, se monta un único disco _root_ del que se puede definir su tipo, tamaño y encriptación (se podrá especificar una clave de encriptación previamente creada). + +[.underline]#Ejemplo:# + +[source,bash] +---- +type: gp3 +size: 384Gi +encrypted: true +encryption_key: +---- + +Estos discos se crean en la provisión inicial de los nodos, por lo que estos datos se pasan como parámetros del descriptor. + +=== _StorageClass_ + +Durante el aprovisionamiento se disponibiliza una _StorageClass_ (default) con nombre "keos" para disco de bloques. Ésta cuenta con los parámetros _reclaimPolicy: Delete_ y _volumeBindingMode: WaitForFirstConsumer_, esto es, que el disco se creará en el momento en que un _pod_ consuma el _PersistentVolumeClaim_ correspondiente, y se eliminará al borrar el _PersistentVolume_. + +Se deberá tener en cuenta que los _PersistentVolumes_ creados a partir de esta _StorageClass_ tendrán afinidad con la zona donde se han consumido. + +Desde el descriptor del cluster se permite indicar la clave de encriptación, la clase de discos o bien parámetros libres. + +[.underline]#Ejemplo con opciones básicas:# + +[source,bash] +---- +spec: + infra_provider: aws + storageclass: + encryption_key: + class: premium +---- + +El parámetro _class_ puede ser "premium" o "standard", esto dependerá del _cloud provider_: + +[.center,cols="1,2,2",width=70%,center] +|=== +^|Provider ^|Standard class ^|Premium class + +^|AWS +^|gp3 +^|io2 (64k IOPS) + +^|GCP +^|pd-standard +^|pd-ssd + +^|Azure +^|StandardSSD_LRS +^|Premium_LRS +|=== + +[.underline]#Ejemplo con parámetros libres:# + +[source,bash] +---- +spec: + infra_provider: gcp + storageclass: + parameters: + type: pd-extreme + provisioned-iops-on-create: 5000 + disk-encryption-kms-key: + labels: "key1=value1,key2=value2" +---- + +Estos últimos también dependen del _cloud provider_: + +[.center,cols="1,2",width=80%] +|=== +^|Provider ^|Parámetro + +^|All +a| +---- + fsType +---- + +^|AWS, GCP +a| +---- + type + labels +---- + +^|AWS +a| +---- + iopsPerGB + kmsKeyId + allowAutoIOPSPerGBIncrease + iops + throughput + encrypted + blockExpress + blockSize +---- + +^|GCP +a| +---- + provisioned-iops-on-create + replication-type + disk-encryption-kms-key +---- + +^|Azure +a| +---- + provisioner + skuName + kind + cachingMode + diskEncryptionType + diskEncryptionSetID + resourceGroup + tags + networkAccessPolicy + publicNetworkAccess + diskAccessID + enableBursting + enablePerformancePlus + subscriptionID +---- +|=== + +En el aprovisionamiento se crean otras _StorageClasses_ (no default) según el provider, pero para utilizarlas, las cargas de trabajo deberán especificarlas en su despliegue. + +=== Amazon EFS + +En esta release, si se desea utilizar un filesystem de EFS, se deberá crear previamente y pasar los siguientes datos al descriptor del cluster: + +[source,bash] +---- +spec: + storageclass: + efs: + name: fs-015ea5e2ba5fe7fa5 + id: fs-015ea5e2ba5fe7fa5 + permissions: 640 +---- + +Con estos datos, se renderizará el keos.yaml de tal forma que en la ejecución del keos-installer se despliegue el driver y se configure la _StorageClass_ correspondiente. + +NOTE: Esta funcionalidad está pensada para infraestructura personalizada, ya que el filesystem de EFS deberá asociarse a un VPC existente en su creación. + + +== Tags en EKS + +Todos los objetos que se crean en EKS contienen por defecto el tag con key _keos.stratio.com/owner_ y como valor, el nombre del cluster. También se permite añadir tags personalizados a todos los objetos creados en el _cloud provider_ de la siguiente forma: + +[source,bash] +---- +spec: + control_plane: + tags: + - tier: production + - billing-area: data +---- + +Para añadir tags a los volúmenes creados por la StorageClass, se deberá utilizar el parámetro _labels_ en la sección correspondiente: + +[source,bash] +---- +spec: + storageclass: + parameters: + labels: "tier=production,billing-area=data" + .. +---- + +== Docker registries + +Como prerrequisito a la instalación de _Stratio KEOS_, las imágenes Docker de todos sus componentes deberán residir en un Docker registry que se indicará en el descriptor del cluster (_keos_registry: true_). Deberá haber un (y sólo uno) Docker registry para KEOS, el resto de registries se configurarán en los nodos para poder utilizar sus imágenes en cualquier despliegue. + +Actualmente se soportan 3 tipos de Docker registries: _generic_, _ecr_ y _acr_. Para el tipo _generic_, se deberá indicar si el registry es autenticado o no (los tipos _ecr_ y _acr_ no pueden tener autenticación), y en caso de serlo, es obligatorio indicar usuario y password en la sección _spec.credentials_. + +Tabla de registries soportados según provider/flavour: + +[.center,cols="2,1",width=40%] +|=== +^|EKS +^|ecr, generic + +^|GCP +^|generic + +^|Azure +^|acr, generic + +^|AKS +^|acr +|=== diff --git a/stratio-docs/es/modules/ROOT/pages/aws_image_builder.adoc b/stratio-docs/es/modules/ROOT/pages/aws_image_builder.adoc new file mode 100644 index 0000000000..f3616b5851 --- /dev/null +++ b/stratio-docs/es/modules/ROOT/pages/aws_image_builder.adoc @@ -0,0 +1,165 @@ +AWS IMAGE BUILDER +================= +// Metadata: +:description: Como crear imagenes propias para el Stratio cloud-provisioner en AWS. +:keywords: aws, image, builder, stratio, cloud-provisioner +// Settings: +// Deshabilitar el modo de compatibilidad +:compat-mode!: +// Deshabilitar la fecha de actualización +:last-update-label!: +// Habilitamos el uso de iconos +:icons: font +// Sobreescritura de la fuente de los iconos +:icon-set: fa +// Definimos el directorio de imagenes +:imagesdir: ../images +// // Refs: +:url-project: https://asciidoctor.org +:url-docs: {url-project}/docs +:url-issues: https://github.com/asciidoctor/asciidoctor +:img-ci: https://github.com/asciidoctor/asciidoctor/workflows/CI/badge.svg +:url-antora: https://docs.antora.org/antora/latest/asciidoc/asciidoc/ +// Tabla de contenidos +:toc: left +:toclevels: 6 +:toc-title: 🛠️ AWS Image Builder +:source-highlighter: rouge +:rouge-style: monokai + +== https://image-builder.sigs.k8s.io/capi/providers/aws.html[Introducción] + +Image Builder se puede utilizar para crear imágenes destinadas a su uso con proveedores de CAPI de Kubernetes. Cada proveedor tiene su propio formato de imágenes con el que puede trabajar. Por ejemplo, las instancias de AWS utilizan AMI. + +== Prerequisitos +=== Prerequisitos Globales +Packer y Ansible se utilizan para construir estas imágenes. Esta herramienta se ha bifurcado y ampliado del proyecto Wardroom. + +Versión del empaquetador (Packer) >= 1.6.0 + +Complemento de Goss para la versión de Packer >= 1.2.0 + +Versión de Ansible >= 2.10.0 + +Si los archivos binarios necesarios no están presentes, se pueden instalar en images/capi/.bin con el comando make deps-ami. Este directorio deberá agregarse a su $PATH. + +=== Prerequisitos de AWS + +==== Prerequisitos Amazon Web Services +* Cuenta de AWS +** https://image-builder.sigs.k8s.io/capi/providers/aws.html#configuration:~:text=Required%20Permissions%20to%20Build%20the%20AWS%20AMIs[IAM User con permisos los minimos necesarios para crear una imagen] +* https://docs.aws.amazon.com/es_es/cli/latest/userguide/cli-chap-configure.html[AWS CLI instalado y configurado] +* VPC por defecto para el usuario de AWS + +[NOTE] +==== +.VPCIdNotSpecified: No default VPC for this user +Editar el fichero images/capi/packer/ami/packer.json y modificar el valor de la variable "vpc_id" por el id de la VPC por defecto de su cuenta de AWS. + +image:https://user-images.githubusercontent.com/112587171/232500508-c90c8901-9ac2-4f94-8bf3-8c986c1ff105.png[] + +image:https://user-images.githubusercontent.com/112587171/232500704-3fcf3706-435e-48af-8caf-d1188812b133.png[] + +.Error: subnet_id or subnet_filter must be provided for non-default VPCs +Editar el fichero images/capi/packer/ami/packer.json y modificar el valor de la variable "subnet_id" por el id de una subnet de la VPC especificada en la variable "vpc_id". + +.Timeout waiting for SSH +* Editar el fichero images/capi/packer/ami/packer.json y modificar el valor de la variable "ssh_keypair_name" por el nombre de la clave ssh que se utilizará para conectarse a la instancia creada a partir de la imagen. +"ssh_keypair_name": "my-ssh-keypair" + +* Así mismo, debe modificar el valor de la variable "ssh_private_key_file" por la ruta al fichero de la clave privada de la clave ssh que se utilizará para conectarse a la instancia creada a partir de la imagen. +"ssh_private_key_file": "/home/user/.ssh/my-ssh-keypair.pem" + +* La maquina virtual debe tener una ip publica para poder conectarse a ella. Si no tiene una ip publica, puede crear una ip publica para la instancia creada a partir de la imagen editando el fichero images/capi/packer/ami/packer.json y modificando/añadiendo el valor de la variable "associate_public_ip_address" a true en la sección "builders". +"associate_public_ip_address": "true + +* Crear/asignar un grupo de seguridad (con permisos al puerto 22) a la instancia creada a partir de la imagen (en la misma red que la instancia creada a partir de la imagen) y modificar/añadir el valor de la variable "security_group_id" con el id del grupo de seguridad creado/asignado en el fichero images/capi/packer/ami/packer.json en la sección "builders". +"security_group_id": "sg-1234567890" + +image:https://user-images.githubusercontent.com/112587171/232501134-2aac0dda-dada-4203-82a6-952dfeee243b.png[] + +* Aañadir la variable ssh_interface = "public_ip" en la sección "builders" del fichero images/capi/packer/ami/packer.json para que se conecte a la instancia creada a partir de la imagen por la ip privada. +"ssh_interface": "public_ip" + +* Crear un "internet gateway" y una "route table (o usar la de defecto)" para la VPC de su cuenta de AWS y asociarlos. + +image:https://user-images.githubusercontent.com/112587171/232501256-7383320b-cc49-4966-bd99-00f407be09bb.png[] + +==== + +== https://image-builder.sigs.k8s.io/capi/capi.html#customization[Configuraciones de la imagen] + +=== https://github.com/kubernetes-sigs/image-builder/tree/1510769a271725cda3d46907182a2843ef5c1c8b/images/capi/packer/ami[Imágenes Disponibles] +Para crear/modificar la configuración de la imagen, puede editar el archivo images/capi/packer/config/ami-.json. Los parámetros de configuración se pueden encontrar en la documentación de Packer (Haz click en la sección de este documento a tal efecto). + +[TIP] +==== +.Modificar las versiones de Kubernetes +📂 https://github.com/kubernetes-sigs/image-builder/blob/3b70f45036617ba8752b0711ee6d212f9591a514/images/capi/packer/config/kubernetes.json[Version de Kubernetes]:: +[%autowidth] +|=== +| *kubernetes_deb_version* | 1.24.10-00 | Version de kubernetes para Debian +| *kubernetes_rpm_version* | 1.24.10-0 | Versión de kubernetes para RPM +| *kubernetes_semver* | 1.24.10 | Versión semántica de Kubernetes que se instalará en la imagen +| *kubernetes_series* | 1.24 | Versión de la serie de Kubernetes que se instalará en la imagen +|=== + +📂 https://github.com/kubernetes-sigs/image-builder/blob/3b70f45036617ba8752b0711ee6d212f9591a514/images/capi/packer/ami/packer.json[Tipo de instancia]:: +[%autowidth] +.Cambiar el tipo de instancia de la imagen +Editar el archivo images/capi/packer/ami/packer.json y modificar el valor de la variable "builder_instance_type" por el tipo de instancia (sección "builders") +deseado. + +"builder_instance_type": "t3.medium" + +.Modificar la región donde crear la instancia para la construcción de la imagen +Editar el archivo images/capi/packer/ami/packer.json y modificar el valor de la variable "region" por la región donde se creará la instancia. (sección "builders") + +"region": "eu-west-1" + +.Limitar las regiones donde disponibilizar la imagen (sección "variables") +"ami_regions": ["eu-west-1", "eu-west-2"] +==== + +== Construcción de la imagen +El siguiente comando instala/comprueba las dependencias necesarias para construir la imagen: +Path: images/capi +[source,shell] +---- +# make deps-ami +---- + +image:https://user-images.githubusercontent.com/112587171/232500797-a8168ab5-23c9-43bc-b9bb-c0af20e0093d.png[Make deps, width=100%] + +Desde el directorio images/capi, ejecute make build-ami-, donde es el sistema operativo deseado. + +Las opciones disponibles se enumeran a través del comando: +[source,shell] +---- +# make help +# make help | grep -i "build-ami" +---- +Por ejemplo, para construir una imagen de Ubuntu 20.04, ejecute: +[source,shell] +---- +# make build-ami-ubuntu-2204 +---- + +image:https://user-images.githubusercontent.com/112587171/232500876-2985090a-86b7-4216-b2c6-8aa544a741f5.png[Make build, width=100%] +... +image:https://user-images.githubusercontent.com/112587171/232500916-6d39cb1b-d6e4-4042-9114-b68d3f14a967.png[Make build, width=100%] + +image:https://user-images.githubusercontent.com/112587171/232500986-ec972a0a-7866-40a4-b945-ec5b9f0bdd2a.png[Make build, width=100%] + +Para compilar todos los sistemas operativos disponibles, utiliza el objetivo -all. Si desea compilarlos en paralelo, use make -j. +[source,shell] +---- +# make -j build-ami-all +---- + +== Debug + +Podemos debugear el proceso de creación de la imagen con la variable de entorno PACKER_LOG +==== +export PACKER_LOG=1 +==== diff --git a/stratio-docs/es/modules/ROOT/pages/azure_image_builder.adoc b/stratio-docs/es/modules/ROOT/pages/azure_image_builder.adoc new file mode 100644 index 0000000000..faf54a5981 --- /dev/null +++ b/stratio-docs/es/modules/ROOT/pages/azure_image_builder.adoc @@ -0,0 +1,108 @@ +AZURE IMAGE BUILDER +=================== +// Metadata: +:description: Como crear imagenes propias para el Stratio cloud-provisioner en Azure. +:keywords: azure, aks, image, builder, stratio, cloud-provisioner +// Settings: +// Deshabilitar el modo de compatibilidad +:compat-mode!: +// Deshabilitar la fecha de actualización +:last-update-label!: +// Habilitamos el uso de iconos +:icons: font +// Sobreescritura de la fuente de los iconos +:icon-set: fa +// Definimos el directorio de imagenes +:imagesdir: ../images +// // Refs: +:url-project: https://asciidoctor.org +:url-docs: {url-project}/docs +:url-issues: https://github.com/asciidoctor/asciidoctor +:img-ci: https://github.com/asciidoctor/asciidoctor/workflows/CI/badge.svg +:url-antora: https://docs.antora.org/antora/latest/asciidoc/asciidoc/ +// Tabla de contenidos +:toc: left +:toclevels: 6 +:toc-title: 🛠️ Azure Image Builder +:source-highlighter: rouge +:rouge-style: monokai + +== https://image-builder.sigs.k8s.io/capi/capi.html[Introducción] + +Image Builder se puede utilizar para crear imágenes destinadas a su uso con proveedores de CAPI de Kubernetes. Cada proveedor tiene su propio formato de imágenes con el que puede trabajar. Por ejemplo, las instancias de AWS utilizan AMI. + +== Prerequisitos +=== Prerequisitos Globales +Packer y Ansible se utilizan para construir estas imágenes. Esta herramienta se ha bifurcado y ampliado del proyecto Wardroom. + +Versión del empaquetador >= 1.6.0 +Complemento de Goss para la versión de Packer >= 1.2.0 +Versión de Ansible >= 2.10.0 +Si los archivos binarios necesarios no están presentes, se pueden instalar en images/capi/.bin con el comando make deps. Este directorio deberá agregarse a su $PATH. + +== https://image-builder.sigs.k8s.io/capi/capi.html#customization[Configuraciones de la imagen] + +=== https://github.com/kubernetes-sigs/image-builder/tree/1510769a271725cda3d46907182a2843ef5c1c8b/images/capi/packer/gce[Imágenes Disponibles] +Para modificar la configuración de la imagen, puede editar el archivo images/capi/packer/config/ami-.json. Los parámetros de configuración se pueden encontrar en la documentación de Packer (Haz click en la sección de este documento a tal efecto). + +[TIP] +==== +.Modificar las versiones de Kubernetes +📂 https://github.com/kubernetes-sigs/image-builder/blob/3b70f45036617ba8752b0711ee6d212f9591a514/images/capi/packer/config/kubernetes.json[Version de Kubernetes]:: +[%autowidth] +|=== +| *kubernetes_deb_version* | 1.24.10-00 | Version de kubernetes para Debian +| *kubernetes_rpm_version* | 1.24.10-0 | Versión de kubernetes para RPM +| *kubernetes_semver* | 1.24.10 | Versión semántica de Kubernetes que se instalará en la imagen +| *kubernetes_series* | 1.24 | Versión de la serie de Kubernetes que se instalará en la imagen +|=== + +📂 https://github.com/kubernetes-sigs/image-builder/blob/3b70f45036617ba8752b0711ee6d212f9591a514/images/capi/packer/ami/packer.json[Tipo de instancia]:: +[%autowidth] +.Cambiar el tipo de instancia de la imagen +Editar el archivo images/capi/packer/ami/packer.json y modificar el valor de la variable "builder_instance_type" por el tipo de instancia +deseado. + +"builder_instance_type": "Standard_D2as_v4" +==== + +== Construcción de la imagen + +. Exportar los datos de la subscripción de Azure en la que vamos a trabajar +[source,shell] +export AZURE_SUBSCRIPTION_ID="" +export AZURE_TENANT_ID="" +export AZURE_LOCATION="" + +. Exportar el resource group que se usará para almacenar las imágenes creadas +[source,shell] +export RESOURCE_GROUP_NAME="" + +. Exportar las credenciales de la cuenta de servicio creadas en el paso anterior +[source,shell] +export AZURE_CLIENT_ID="" +export AZURE_CLIENT_SECRET="" + +. Clonar el repositorio de image-builder si no lo tienías previamente +[source,shell] +git clone https://github.com/kubernetes-sigs/image-builder.git +cd image-builder/images/capi/ + +. Instalar las dependencias necesarias para crear la imagen +[source,shell] +make deps-azure + +. Consultar las imágenes que podemos construir +[source,shell] +make help | grep build-azure-sig + +. Generar la imágen deseada +[source,shell] +make build-azure-sig-ubuntu-2204 + +== Debug + +Podemos debugear el proceso de creación de la imagen con la variable de entorno PACKER_LOG +[source,shell] +export PACKER_LOG=1 + diff --git a/stratio-docs/es/modules/ROOT/pages/gcp_image_builder.adoc b/stratio-docs/es/modules/ROOT/pages/gcp_image_builder.adoc new file mode 100644 index 0000000000..1d073152b3 --- /dev/null +++ b/stratio-docs/es/modules/ROOT/pages/gcp_image_builder.adoc @@ -0,0 +1,146 @@ +GCP IMAGE BUILDER +================= +// Metadata: +:description: Como crear imagenes propias para el Stratio cloud-provisioner en GCP. +:keywords: gcp, image, builder, stratio, cloud-provisioner +// Settings: +// Deshabilitar el modo de compatibilidad +:compat-mode!: +// Deshabilitar la fecha de actualización +:last-update-label!: +// Habilitamos el uso de iconos +:icons: font +// Sobreescritura de la fuente de los iconos +:icon-set: fa +// Definimos el directorio de imagenes +:imagesdir: ../images +// // Refs: +:url-project: https://asciidoctor.org +:url-docs: {url-project}/docs +:url-issues: https://github.com/asciidoctor/asciidoctor +:img-ci: https://github.com/asciidoctor/asciidoctor/workflows/CI/badge.svg +:url-antora: https://docs.antora.org/antora/latest/asciidoc/asciidoc/ +// Tabla de contenidos +:toc: left +:toclevels: 6 +:toc-title: 🛠️ GCP Image Builder +:source-highlighter: rouge +:rouge-style: monokai + +== https://image-builder.sigs.k8s.io/capi/capi.html[Introducción] + +Image Builder se puede utilizar para crear imágenes destinadas a su uso con proveedores de CAPI de Kubernetes. Cada proveedor tiene su propio formato de imágenes con el que puede trabajar. Por ejemplo, las instancias de AWS utilizan AMI. + +== Prerequisitos +=== Prerequisitos Globales +Packer y Ansible se utilizan para construir estas imágenes. Esta herramienta se ha bifurcado y ampliado del proyecto Wardroom. + +Versión del empaquetador >= 1.6.0 +Complemento de Goss para la versión de Packer >= 1.2.0 +Versión de Ansible >= 2.10.0 +Si los archivos binarios necesarios no están presentes, se pueden instalar en images/capi/.bin con el comando make deps. Este directorio deberá agregarse a su $PATH. + +=== Prerequisitos de Google Cloud Platform + +==== https://cloud.google.com/iam/docs/creating-managing-service-accounts#creating[Crear un cuenta de Servicio] +[source,text] +---- +compute.disks.create +compute.disks.delete +compute.disks.get +compute.disks.list +compute.disks.use +compute.disks.useReadOnly +compute.globalOperations.get +compute.images.create +compute.images.delete +compute.images.get +compute.images.getFromFamily +compute.images.list +compute.images.useReadOnly +compute.instances.create +compute.instances.delete +compute.instances.get +compute.instances.list +compute.instances.setLabels +compute.instances.setMetadata +compute.instances.setServiceAccount +compute.instances.use +compute.machineTypes.get +compute.subnetworks.use +compute.subnetworks.useExternalIp +compute.zoneOperations.get +compute.zones.get +iam.serviceAccounts.actAs +---- +==== https://cloud.google.com/iam/docs/keys-create-delete?hl=es-419[Google Service Account Key] +image:https://user-images.githubusercontent.com/112587171/233296971-6e999cac-cfab-42d4-a20e-93429dbcbc2f.png[alt="Google Service Account Key"] +==== https://image-builder.sigs.k8s.io/capi/providers/gcp.html#install-ansible-and-packer:~:text=compliant%20VM%20image.-,Install%20Ansible%20and%20Packer,-Start%20by%20launching[Ansible y Packer] +==== https://cloud.google.com/sdk/docs/install?hl=es-419[Gcloud] + +== https://image-builder.sigs.k8s.io/capi/capi.html#customization[Configuraciones de la imagen] + +=== https://github.com/kubernetes-sigs/image-builder/tree/1510769a271725cda3d46907182a2843ef5c1c8b/images/capi/packer/gce[Imágenes Disponibles] +Para modificar la configuración de la imagen, puede editar el archivo images/capi/packer/config/ami-.json. Los parámetros de configuración se pueden encontrar en la documentación de Packer (Haz click en la sección de este documento a tal efecto). + +[TIP] +==== +.Modificar las versiones de Kubernetes +📂 https://github.com/kubernetes-sigs/image-builder/blob/3b70f45036617ba8752b0711ee6d212f9591a514/images/capi/packer/config/kubernetes.json[Version de Kubernetes]:: +[%autowidth] +|=== +| *kubernetes_deb_version* | 1.24.10-00 | Version de kubernetes para Debian +| *kubernetes_rpm_version* | 1.24.10-0 | Versión de kubernetes para RPM +| *kubernetes_semver* | 1.24.10 | Versión semántica de Kubernetes que se instalará en la imagen +| *kubernetes_series* | 1.24 | Versión de la serie de Kubernetes que se instalará en la imagen +|=== + +📂 https://github.com/kubernetes-sigs/image-builder/blob/3b70f45036617ba8752b0711ee6d212f9591a514/images/capi/packer/ami/packer.json[Tipo de instancia]:: +[%autowidth] +.Cambiar el tipo de instancia de la imagen +Editar el archivo images/capi/packer/ami/packer.json y modificar el valor de la variable "builder_instance_type" por el tipo de instancia +deseado. + +"builder_instance_type": "t3.mmedium" +==== + +== Construcción de la imagen + +. Exportar el ID del proyecto GCP en el que desea construir imágenes +[source,shell] +# export GCP_PROJECT_ID= + +. Exportar la ruta a las credenciales de la cuenta de servicio creadas en el paso anterior +[source,shell] +# export GOOGLE_APPLICATION_CREDENTIALS= + +. Clona el repositorio de image-builder si no lo tienías previamente +[source,shell] +# git clone https://github.com/kubernetes-sigs/image-builder.git +# cd image-builder/images/capi/ + +. Ejecutar el comando make deps-gce para instalar Ansible y Packer +[source,shell] +# make deps-gce +image:https://user-images.githubusercontent.com/112587171/233297601-f3f2dc5e-0888-429c-ae6a-24e259260240.png[alt="Make deps GCP",width=800] + +** Generar imágen específica +[source,shell] +# make build-gce-ubuntu-2204 + +:imagesdir: ../images +image:https://user-images.githubusercontent.com/112587171/233297883-5029b10e-912d-42b7-b7ef-c941993c98c6.png[alt="Make build GCP",width=800] + +image:https://user-images.githubusercontent.com/112587171/233298080-c50f610c-85e6-445e-8ed5-77cdc66fad26.png[alt="Make build GCP",width=800] + +** Generar todas las disponibles +[source,shell] +# make build-gce-all + +== Debug + +Podemos debugear el proceso de creación de la imagen con la variable de entorno PACKER_LOG +==== +export PACKER_LOG=1 +==== + diff --git a/stratio-docs/es/modules/ROOT/pages/installation.adoc b/stratio-docs/es/modules/ROOT/pages/installation.adoc new file mode 100644 index 0000000000..b35e4ec37c --- /dev/null +++ b/stratio-docs/es/modules/ROOT/pages/installation.adoc @@ -0,0 +1,721 @@ += Instalación + +== Prerrequisitos + +=== EKS + +* Roles y políticas ++ +Para el aprovisionamiento automatizado en EKS, se necesita ejecutar acciones sobre diversos servicios de AWS como ec2, ecr, eks, elasticloadbalancing, etc. Si bien la utilización o no de estas acciones dependerá del tipo de instalación, el proveedor valida que el usuario indicado tenga estos permisos para poder ejecutarse con normalidad. ++ +** xref:attachment$stratio-eks-policy.json[Descargar permisos permanentes para EKS] +** xref:attachment$stratio-aws-temp-policy.json[Descargar permisos temporales para EKS] + +* Sistemas operativos certificados ++ +Para asegurar las funcionalidades soportadas por el _control-plane_ gestionado de EKS, se deberá utilizar cualquier AMI provista por AWS específicamente para este fin. ++ +Las https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-ami.html[AMI optimizadas para Amazon EKS] se crean sobre el sistema operativo _Amazon Linux 2_. + +=== GCP + +* Permisos ++ +Para los despliegues en Google Cloud Platform, se necesitarán principalmente permisos en _compute_ (instancias, discos, imágenes, _routers_, redes, etc.). Al igual que con otros proveedores soportados, el aprovisionamiento requiere una cuenta con todos los permisos solicitados. ++ +** xref:attachment$stratio-gcp-permissions.list[Descargar permisos para GCP] + +* Sistemas operativos certificados ++ +Para los entornos en GCP, se deberá utilizar https://github.com/kubernetes-sigs/image-builder/tree/master/images/capi[_image builder_], una herramienta oficial que permite crear y disponibilizar imágenes para _Stratio KEOS_. Para mayor detalle en la construcción de las imágenes ver la xref:ROOT:gcp_image_builder.adoc[guía para GCP]. ++ +El sistema operativo recomendado actualmente para este proveedor es Ubuntu 22.04. + +=== Azure no-gestionado + +* Permisos ++ +Al igual que con otros proveedores soportados, el aprovisionamiento requiere una cuenta con todos los permisos solicitados, pero en este caso además se requiere un role para los nodos del cluster (indicado en el descriptor en _spec.security.nodes_identity_). ++ +** xref:attachment$stratio-azure-role.json[Descargar permisos para Azure] +** xref:attachment$stratio-azure-nodes-role.json[Descargar permisos para nodos de Azure] + +* Sistemas operativos certificados ++ +Para los entornos en Azure, se podrá utilizar https://github.com/kubernetes-sigs/image-builder/tree/master/images/capi[_image builder_], una herramienta oficial que permite crear y disponibilizar imágenes para _Stratio KEOS_. Para mayor detalle en la construcción de las imágenes ver la xref:ROOT:azure_image_builder.adoc[guía para Azure]. ++ +El sistema operativo recomendado actualmente para este proveedor es Ubuntu 22.04, siendo el que crea por defecto el controller de este _cloud provider_. ++ +El sistema operativo recomendado actualmente para este proveedor es Ubuntu 22.04. + +=== AKS + +* Permisos ++ +Para este tipo de clusters se deberá desplegar utilizando una identidad con los roles Contributor, Managed Identity Operator, y la política de AcrPull para el ACR. + +Al igual que para el caso anterior, se requiere un role para los nodos del cluster (indicado en el descriptor en _spec.security.nodes_identity_). ++ +xref:attachment$stratio-azure-nodes-role.json[Descargar permisos para nodos de Azure] + +* Sistemas operativos certificados ++ +Este flavour no permite especificar ninguna imágen custom, y despliega por defecto Ubuntu 22.04. + +=== Consideraciones para imágenes + +Si nos referimos al control-plane, y como es evidente, en EKS y AKS no se podrá indicar una imágen, pero en Azure no-gestionado y en GCP si, siendo obligatorio para este último caso. + +Para los nodos workers, es opcional en todos los casos (al no indicarla, el controller asigna una disponibilizada por el _cloud provider_) menos GCP, donde también será obligatorio especificarla ya que no disponibiliza ninguna imágen. + +Al momento de crear la imágen para el cluster, se deberán tener en cuenta las necesidades de Sistema Operativo para las aplicaciones que lo requieran (systemd units, DaemonSets, etc.). + +==== Elasticsearch + +Para soportar los despliegues de Elasticsearch, el Sistema Operativo deberá contar con el parámetro "max_map_count = 262144" del sysctl como indica su https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html[documentación oficial]. + +Para las imágenes creadas con _image-builder_ (*GCP y Azure unmanaged*), hay que añadir el siguiente elemento en el https://github.com/kubernetes-sigs/image-builder/blob/main/images/capi/ansible/roles/node/tasks/main.yml#L55[loop de los parámetros del kernel] (en _/images/capi/ansible/roles/node/tasks/main.yml_): + +[source,bash] +---- +- { param: vm.max_map_count, val: 262144 } +---- + +Las imágenes de _Amazon Linux 2_ utilizadas por *EKS* ya cuentan con este parámetro/valor. + +Para el caso de *AKS*, y dado que las imágenes no pueden ser construidas con image-builder, se deberá hacer con el objeto AzureManagedMachinePool, eliminandolo y re-creandolo (no se permite su edición) con el siguiente parámetro: + +[source,bash] +---- +spec: + linuxOSConfig: + sysctls: + vmMaxMapCount: 262144 +---- + +== Descriptor del _cluster_ + +Para indicar las particularidades del _cluster_ se utiliza el objeto _KeosCluster_ en un fichero _manifest_. + +La cabecera de este descriptor será la misma que la de cualquier objeto de Kubernetes: + +[source,bash] +---- +apiVersion: installer.stratio.com/v1beta1 +kind: KeosCluster +spec: +---- + +=== _spec_ + +El _spec_ del _KeosCluster_ está compuesto por los siguientes campos: + +[cols="1,4,2,1"] +|=== +^|Nombre ^|Descripción ^|Ejemplo ^|Opcional + +|cluster$$_$$id +|Nombre del _cluster_. +|my-cluster +|No + +|infra$$_$$provider +|Nombre del _cloud provider_ (AWS o GCP). +|AWS +|No + +|<> +|Set de credenciales del _cloud provider_ usadas en el aprovisionamiento. +|Ver el <> +|No en 1a ejecución. + +|k8s$$_$$version +|Versión de Kubernetes del _cluster_. Debe estar alineada tanto con el _cloud provider_ como con _Stratio KEOS_. Nota: EKS no tiene en cuenta la _patch version_. +|v1.24.10 +|No + +|region +|Región del _cloud provider_ usada para el aprovisionamiento. +|eu-west-1 +|No + +|docker$$_$$registries +|_Registries_ de Docker accesibles por los nodos. +|- +|No + +|<> +|Identificadores de la infraestructura creada previamente. +|Ver el <> +|Si + +|<> +|Especificaciones para el _control-plane_ de Kubernetes. +|Ver el <> +|No + +|<> +|Especificaciones de los grupos de nodos _worker_. +|ver el <> +|No + +|external$$_$$domain +|Dominio externo al _cluster_. +|domain.ext +|No + +|<> +|Sección de configuraciones para la instalación de _Stratio KEOS_. +|ver el <> +|No + +|=== + +=== Credenciales + +En la primera ejecución, las credenciales para el aprovisionamiento en el _cloud provider_ se indicarán en este apartado. + +Estos secretos se cifran con una _passphrase_ solicitada desde en el aprovisionamiento en el fichero _secrets.yml_, eliminándose todo el apartado de credenciales del descriptor. + +En posteriores ejecuciones, simplemente se solicita la _passphrase_ para descifrar el fichero de secretos, de donde se leen las credenciales. + +Los siguientes campos son considerados secretos del aprovisionamiento: + +[cols="1,4,2,1"] +|=== +^|Nombre ^|Descripción ^|Ejemplo ^|Opcional + +|aws +|Credenciales para acceso a AWS. +|Ver el <> +|No cuando infra$$_$$provider=aws. + +|gcp +|Credenciales para acceso a GCP. +|ver el <> +|No cuando infra$$_$$provider=gcp. + +|github$$_$$token +|Token de GitHub. Se puede utilizar un _Fine-grained token_ o un token tipo _classic_ y no necesita ningún permiso. Para generarlo, ve a: 'Settings' → 'Developer settings' → 'Personal access tokens'. +|github$$_$$pat$$_$$11APW. +|No + +|docker$$_$$registries +|_Registries_ de Docker accesibles por los nodos. Para EKS, no hace falta autenticación, ya que se hace automáticamente con las credenciales del usuario. +|- +|Sí + +|=== + +NOTE: Cualquier cambio en spec.credentials debe hacerse con todas las credenciales en el descriptor del cluster y eliminando previamente el secrets.yml. + +=== Redes + +Como se ha mencionado anteriormente, el instalador permite utilizar elementos de red del _cloud provider_ creados anteriormente (por ejemplo, por un equipo de seguridad de redes), posibilitando así las arquitecturas que mejor se adapten a nuestras necesidades. + +Tanto el VPC como las _subnets_ deberán estar creadas en el _cloud provider_. Las _subnets_ podrán ser privadas o públicas, pero en éste último caso, deberán contar con un _NAT gateway_ y un _Internet Gateway_ en el mismo VPC. En caso de indicar _subnets_ de ambos tipos, los nodos _worker_ se desplegarán en _subnets_ privadas. + +_Stratio KEOS_ no gestionará el ciclo de vida de los objetos creados previamente. + +[cols="1,4,2,1"] +|=== +^|Nombre ^|Descripción ^|Ejemplo ^|Opcional + +|vpc$$_$$id +|VPC ID. +|vpc-0264503b8761ff69f +|Sí + +|_subnets_ +|_Array_ de _subnet_'s IDs. +a| +[source,bash] +---- +- subnet_id: subnet-0df.. +- subnet_id: subnet-887.. +---- +|Sí + +|=== + +=== _control-plane_ + +En este apartado se indican las particularidades para el _control-plane_ de Kubernetes. + +[cols="1,4,2,1"] +|=== +^|Nombre ^|Descripción ^|Ejemplo ^|Opcional + +|aws +|Valores específicos para el _logging_ de EKS (APIserver, audit, authenticator, controller$$_$$manager y/o scheduler). +a| +[source,bash] +---- +logging: + api_server: true +---- +|Sí + +|managed +|Indica si el _control-plane_ es o no gestionado en el _cloud provider_. +|true +|No + +|=== + +=== Nodos _worker_ + +En este apartado se especifican los grupos de nodos _worker_ y sus características. + +Las imágenes utilizadas deberán estar soportadas por EKS (ver https://repost.aws/knowledge-center/eks-custom-linux-ami[creación de AMI personalizadas]). + +[cols="1,4,2,1"] +|=== +^|Nombre ^|Descripción ^|Ejemplo ^|Opcional + +|name +|Nombre del grupo. Se utilizará como prefijo de las instancias. +|eks-prod-gpu +|No + +|quantity +|Cantidad de nodos del grupo. Se recomienda que sea múltiplo de 3 para no tener zonas desbalanceadas. +|15 +|No + +|size +|Tipo de instancia. +|t3.medium +|No + +|max$$_$$size / min$$_$$size +|Máximo y mínimo número de instancias para el autoescalado. +|6 / 18. +|Sí + +|az +|Zona para todo el grupo (invalida el parámetro zone$$_$$distribution). +|eu-east-1a +|Sí + +|zone$$_$$distribution +|Indica si los nodos se repartirán equitativamente en las zonas (por defecto) o no. +|unbalanced +|Sí + +|node$$_$$image +|Imagen de instancia utilizada para los nodos _worker_. +|ami-0de933c15c9b49fb5 +|No para infra$$_$$provider: gcp + +|_labels_ +|Etiquetas de Kubernetes para los nodos _worker_. +a| +[source,bash] +---- +labels: + disktype: standard + gpus: true +---- +|Si + +|root$$_$$volume +|Particularidades del volumen como tamaño, tipo y encriptación. +a| +[source,bash] +---- +root_volume: + size: 50 + type: gp3 + encrypted: true +---- +|Si + +|ssh$$_$$key +|Clave SSH pública para acceso a los nodos _worker_. Debe estar creada en AWS previamente. Se recomienda no añadir ninguna clave SSH a los nodos. +|prod-key +|Sí + +|=== + +=== _Stratio KEOS_ + +Los parámetros para la fase del _keos-installer_ se indicarán en este apartado. + +[cols="1,4,2,1"] +|=== +^|Nombre ^|Descripción ^|Ejemplo ^|Opcional + +|flavour +|Sabor de instalación, que indica tamaño del _cluster_ y resiliencia. Por defecto es "production". +|development +|Sí + +|version +|Versión del _keos-installer_. +|0.8.0 +|No + +|=== + +=== Ejemplo de descriptor + +Se presentan dos casos de descriptor para demostrar la capacidad del _cloud-provisioner_ en ambos _cloud providers_ soportados. + +==== EKS + +En este ejemplo se pueden ver las siguientes particularidades: + +* _Cluster_ en AWS con _control-plane_ gestionado (EKS). +* Kubernetes versión 1.24.x (EKS no tiene en cuenta la _patch version_). +* Uso de ECR como _Docker registry_ (no necesita credenciales). +* Uso de VPC y _subnets_ personalizadas (creadas anteriormente). Este apartado es opcional. +* Se habilitan los _logs_ del APIserver en EKS. +* Grupos de nodos _workers_ con múltiples casuísticas: +** Diferentes tipos de instancia. +** Con AMI específica (opcional para este _cloud provider_). Nota: las versiones de los componentes de la imagen deberán estar alineadas con la versión de Kubernetes indicada. +** Con clave SSH. +** Con etiquetas de K8s. +** Con rangos de autoescalado. +** En una zona fija. +** Con personalizaciones en el disco. +** Con instancias tipo _spot_. +** Casos de distribución en AZs: balanceado y desbalanceado. + +[source,bash] +---- +apiVersion: installer.stratio.com/v1beta1 +kind: KeosCluster +spec: + cluster_id: eks-prod + infra_provider: aws + credentials: + aws: + region: eu-west-1 + access_key: AKIAT4.. + account_id: '3683675..' + secret_key: wq3/Vsc.. + github_token: github_pat_11APW.. + k8s_version: v1.24.0 + region: eu-west-1 + networks: + vpc_id: vpc-02698.. + subnets: + - subnet_id: subnet-0416d.. + - subnet_id: subnet-0b2f8.. + - subnet_id: subnet-0df75.. + docker_registries: + - url: AABBCC.dkr.ecr.eu-west-1.amazonaws.com/keos + auth_required: false + type: ecr + keos_registry: true + control_plane: + aws: + logging: + api_server: true + managed: true + worker_nodes: + - name: eks-prod-xlarge + quantity: 6 + max_size: 18 + min_size: 6 + size: m6i.xlarge + labels: + disktype: standard + root_volume: + size: 50 + type: gp3 + encrypted: true + ssh_key: stg-key + - name: eks-prod-medium-spot + quantity: 4 + zone_distribution: unbalanced + size: t3.medium + spot: true + labels: + disktype: standard + - name: eks-prod-medium-az + quantity: 3 + size: t3.medium + az: eu-west-1c + node_image: ami-0de933c15c9b49fb5 + external_domain: domain.ext + keos: + domain: cluster.local + flavour: production + version: 0.8.2 +---- + +==== GCP + +En este ejemplo se pueden ver las siguientes particularidades: + +* _Cluster_ en GCP con _control-plane_ no gestionado. +* Uso de un _Docker registry_ autenticado genérico (con sus credenciales). +* Sin control de la zona DNS (habilitado por defecto). +* Características de las VMs para el _control-plane_: +** Con alta disponibilidad (se despliegan 3 instancias). +** Con tipo de instancia específico. +** Con imagen específica (obligatoria para este _cloud provider_). Nota: las versiones de los componentes de la imagen deberán estar alineadas con la versión de Kubernetes indicada. +** Con personalizaciones en el disco. +* Grupos de nodos _workers_ con múltiples casuísticas: +** Diferentes tipos de instancia. +** Con imagen específica (obligatoria para este _cloud provider_). Nota: las versiones de los componentes de la imagen deberán estar alineadas con la versión de Kubernetes indicada. +** Con clave SSH. +** Con etiquetas de K8s. +** Con rangos de autoescalado. +** En una zona fija. +** Con personalizaciones en el disco. +** Con instancias tipo _spot_. +** Casos de distribución en AZs: balanceado y desbalanceado. + +[source,bash] +---- +apiVersion: installer.stratio.com/v1beta1 +kind: KeosCluster +spec: + cluster_id: gcp-prod + infra_provider: gcp + credentials: + gcp: + private_key_id: "efdf19f5605a.." + private_key: "-----BEGIN PRIVATE KEY-----\nMIIEvw.." + client_email: keos@stratio.com + project_id: gcp-prod + region: europe-west4 + client_id: "6767910929.." + github_token: github_pat_11APW.. + docker_registries: + - url: keosregistry.stratio.com/keos + user: "myuser" + pass: "mypass" + k8s_version: v1.24.12 + region: europe-west4 + docker_registries: + - url: eosregistry.azurecr.io/keos + auth_required: false + type: acr + keos_registry: true + dns: + manage_zone: false + control_plane: + managed: false + highly_available: true + size: c2d-highcpu-4 + node_image: projects/gcp-prod/global/images/ubuntu-2204-v1-24-12-1679997686 + worker_nodes: + - name: gcp-prod-xlarge + quantity: 6 + max_size: 18 + min_size: 6 + size: c2d-highcpu-4 + labels: + disktype: standard + root_volume: + size: 50 + type: pd-standard + encrypted: true + node_image: projects/gcp-prod/global/images/ubuntu-2204-v1-24-12-1679997686 + ssh_key: stg-key + - name: gcp-prod-medium-spot + quantity: 4 + zone_distribution: unbalanced + size: c2d-highcpu-4 + spot: true + labels: + disktype: standard + node_image: projects/gcp-prod/global/images/ubuntu-2204-v1-24-12-1679997686 + - name: gcp-prod-medium-az + quantity: 3 + size: c2d-highcpu-4 + az: europe-west4-a + node_image: projects/gcp-prod/global/images/ubuntu-2204-v1-24-12-1679997686 + external_domain: domain.ext + keos: + domain: cluster.local + flavour: production + version: 0.8.2 +---- + +==== Azure no-gestionado + +En este ejemplo se pueden ver las siguientes particularidades: + +* _Cluster_ en Azure con _control-plane_ no gestionado. +* Uso de ACR como _Docker registry_ (no necesita credenciales). +* Uso de un CIDR específico para Pods. +* Características de las VMs para el _control-plane_: +** Con alta disponibilidad (se despliegan 3 instancias). +** Con tipo de instancia específico. +** Sin imagen específica (opcional para este _cloud provider_). +** Con personalizaciones en el disco. +* Grupo de nodos _workers_: +** Con imagen específica (opcional para este _cloud provider_). Nota: las versiones de los componentes de la imagen deberán estar alineadas con la versión de Kubernetes indicada. +** Con etiquetas de K8s. +** Con rangos de autoescalado. +** Con personalizaciones en el disco. + +[source,bash] +---- +apiVersion: installer.stratio.com/v1beta1 +kind: KeosCluster +spec: + cluster_id: azure-prod + infra_provider: azure + credentials: + client_id: ee435ab0.. + client_secret: lSF8Q~n.. + subscription_id: '6e2a38cd-e..' + tenant_id: '9c2f8eb6-5..' + k8s_version: v1.24.13 + region: westeurope + docker_registries: + - url: eosregistry.azurecr.io/keos + auth_required: false + type: acr + keos_registry: true + networks: + pods_cidr: 172.16.0.0/20 + security: + nodes_identity: "/subscriptions/6e2a38cd-../stratio-nodes" + control_plane: + managed: false + size: Standard_D8_v3 + root_volume: + size: 50 + type: Standard_LRS + worker_nodes: + - name: azure-prod-std + quantity: 3 + max_size: 18 + min_size: 3 + size: Standard_D8_v3 + labels: + backup: false + root_volume: + size: 50 + type: Standard_LRS + node_image: "/subscriptions/6e2a38cd-../images/capi-ubuntu-2204-1687262553" + external_domain: domain.ext + keos: + domain: cluster.local + flavour: production + version: 0.8.2 +---- + +==== AKS + +En este ejemplo se pueden ver las siguientes particularidades: + +* _Cluster_ en Azure con _control-plane_ gestionado (AKS). +* Kubernetes versión 1.24.11 (deberá estar soportada por Azure). +* Uso de ACR como _Docker registry_ (no necesita credenciales). +* Con tier _Paid_ de AKS (recomendado para producción). +* Grupo de nodos _workers_: +** Instancias tipo Standard_D8s_v3 para poder soportar volúmenes premium. +** Con etiquetas de K8s. +** Con rangos de autoescalado. +** Con personalizaciones en el disco. + +[source,bash] +---- +apiVersion: installer.stratio.com/v1beta1 +kind: KeosCluster +spec: + cluster_id: aks-prod + infra_provider: azure + credentials: + client_id: ee435ab0.. + client_secret: lSF8Q~n.. + subscription_id: '6e2a38cd-e..' + tenant_id: '9c2f8eb6-5..' + k8s_version: v1.24.0 + region: westeurope + docker_registries: + - url: eosregistry.azurecr.io/keos + auth_required: false + type: acr + keos_registry: true + networks: + pods_cidr: 172.16.0.0/20 + storageclass: + encryption_key: myKey + class: premium + control_plane: + azure: + identity_id: "/subscriptions/6e2a38cd-../stratio-nodes" + tier: Paid + managed: true + worker_nodes: + - name: aks-prod-prem + quantity: 3 + max_size: 21 + min_size: 3 + size: Standard_D8s_v3 + labels: + premium_sc: "true" + root_volume: + size: 50 + type: Managed + external_domain: domain.ext + keos: + domain: cluster.local + flavour: production + version: 0.8.2 +---- + +== Creación del cluster + +_cloud-provisioner_ es una herramienta que facilita el aprovisionamiento de los elementos necesarios en el _cloud provider_ especificado para la creación de un _cluster_ de Kubernetes según el <> especificado. + +Actualmente, este binario incluye las siguientes opciones: + +- `--descriptor`: permite indicar la ruta al descriptor del _cluster_. +- `--vault-password`: permite indicar la _passphrase_ de cifrado de las credenciales. +- `--avoid-creation`: no se crea el _cluster_ _worker_, sólo el _cluster_ local. +- `--keep-mgmt`: crea el cluster _worker_ pero deja su gestión en el _cluster_ local. +- `--retain`: permite mantener el _cluster_ local aún sin gestión. + +Para crear un _cluster_, basta con un simple comando (ver particularidades de cada provider en las Quickstart guides): + +[source,bash] +----- +sudo ./cloud-provisioner create cluster --name stratio-pre --descriptor cluster-gcp.yaml +Vault Password: +Rewrite Vault Password: +Creating temporary cluster "stratio-pre" ... + ✓ Ensuring node image (kindest/node:v1.24.7) 🖼 + ✓ Building Stratio image (stratio-capi-image:v1.24.7) 📸 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 + ✓ Installing CAPx 🎖️ + ✓ Generating workload cluster manifests 📝 + ✓ Generating secrets file 📝🗝️ + ✓ Creating the workload cluster 💥 + ✓ Saving the workload cluster kubeconfig 📝 + ✓ Installing Calico in workload cluster 🔌 + ✓ Installing StorageClass in workload cluster 💾 + ✓ Preparing nodes in workload cluster 📦 + ✓ Enabling workload cluster's self-healing 🏥 + ✓ Installing CAPx in workload cluster 🎖️ + ✓ Adding Cluster-Autoescaler 🗚 + ✓ Moving the management role 🗝️ + ✓ Generating the KEOS descriptor 📝 + +The cluster has been installed, please refer to _Stratio KEOS_ documentation on how to proceed. +----- + +Una vez finalizado el proceso, tendremos los ficheros necesarios (_keos.yaml_ y _secrets.yml_) para instalar _Stratio KEOS_. + +NOTE: Dado que el fichero descriptor para la instalación (keos.yaml) se regenera en cada ejecución, se realiza un backup del anterior en el directorio local con la fecha correspondiente (p.ej. _keos.yaml.2023-07-05@11:19:17~_). + +=== Load Balancer + +Debido a un bug en los distintos controllers (solucionado en ramas master pero aún sin release), el Load Balancer creado en los _cloud providers_ de GCP y Azure para el APIserver de los clusters con control-planes no-gestionados, se genera con un Healthcheck basado en TCP. + +Eventualmente, esto podría generar problemas en las peticiones en caso de fallo de alguno de los nodos del control-plane, dado que el Load Balancer enviará peticiones a los nodos del control plane cuyo puerto responda pero no pueda atender peticiones. + +Para evitar este problema, se deberá modificar el Healthcheck del LoadBalancer creado, utilizando protocolo HTTPS y path /readyz. El puerto deberá mantenerse, siendo para GCP el 443 y para Azure el 6443. diff --git a/stratio-docs/es/modules/ROOT/pages/introduction.adoc b/stratio-docs/es/modules/ROOT/pages/introduction.adoc new file mode 100644 index 0000000000..fd4fa2156e --- /dev/null +++ b/stratio-docs/es/modules/ROOT/pages/introduction.adoc @@ -0,0 +1,5 @@ += Introducción + +_Stratio KEOS_ tiene la capacidad de desplegarse en diversos proveedores del _Cloud_. Actualmente, de forma nativa, se soporta xref:ROOT:architecture.adoc#_gcp[Google Cloud Platform (GCP)] en modo no-gestionado, Amazon Web Services (AWS) en modo gestionado con xref:ROOT:architecture.adoc#_eks[Elastic Kubernetes Service (EKS)], y Azure en ambos modos: xref:ROOT:architecture.adoc#_azure[no-gestionado] y xref:ROOT:architecture.adoc#_aks[Azure Kubernetes Service (AKS)]. + +La versión del _Stratio Cloud Provisioner_ es la 0.2.0. diff --git a/stratio-docs/es/modules/ROOT/pages/operations.adoc b/stratio-docs/es/modules/ROOT/pages/operations.adoc new file mode 100644 index 0000000000..538c86f44a --- /dev/null +++ b/stratio-docs/es/modules/ROOT/pages/operations.adoc @@ -0,0 +1,502 @@ +:caution-caption: ⛔ += Operaciones + +== Obtención del _kubeconfig_ + +Para comunicarse con el APIserver del _cluster_ creado, es necesario el fichero _kubeconfig_, que se obtendrá de forma diferente según el proveedor _Cloud_ utilizado y la gestión del control-plane del _cluster_. + +* Para EKS, se obtendrá de la forma indicada por AWS: + +[source,bash] +----- +aws eks update-kubeconfig --region eu-west-1 --name example-eks --kubeconfig ./example-eks.kubeconfig +----- + +* Para GCP, Azure no-gestionado y AKS, al finalizar del aprovisionamiento, el _kubeconfig_ se deja en el directorio de ejecución (_workspace_): + +[source,bash] +----- +ls ./.kube/config +./.kube/config +----- + +A su vez, podrá utilizarse el alias "kw" desde el container local para interactuar con el cluster worker (en EKS, el token utilizado sólo dura 10 minutos): + +[source,bash] +----- +root@example-azure-control-plane:/# kw get nodes +NAME STATUS ROLES AGE VERSION +example-azure-control-plane-6kp94 Ready control-plane 60m v1.24.13 +example-azure-control-plane-fgkcc Ready control-plane 63m v1.24.13 +... +----- + +== Autenticación en EKS + +Si bien no forma parte de la operativa de _Stratio KEOS_, es importante resaltar la forma de permitir la https://docs.aws.amazon.com/eks/latest/userguide/add-user-role.html[autenticación de otros usuarios en un _cluster_ de EKS] (el usuario creador del _cluster_ está autenticado por defecto). + +Para dar permisos de kubernetes-admin en el _cluster_, se agregará el ARN del usuario en el _ConfigMap_ indicado a continuación. + +[source,bash] +---- +$ kubectl -n kube-system edit cm aws-auth +.. +data: + mapUsers: | + - groups: + - system:masters + userarn: + username: kubernetes-admin +---- + +== Operación de la infraestructura + +image::controllers.png[] + +_Stratio KEOS_ permite realizar múltiples operaciones avanzadas interactuando únicamente con el APIserver (infrastructure as code o IaC), siendo los _controllers_ desplegados quienes, en sus ciclos de reconciliación, realicen las tareas necesarias. + +NOTE: Como se verá a continuación, *los grupos de nodos en AKS se gestionan con MachinePools* en vez de MachineDeployments como el resto de providers, lo que deriva en particularidades al momento de realizar algunas operaciones. + +=== CRDs + +image::crds.png[] + +Para la gestión APIficada del _cluster_, se crean los siguientes grupos de objetos según el provider: + +===== EKS + +- La definición del cluster se hace con los objetos _Cluster_ y _AWSManagedCluster_. +- Para definir parámetros del _control-plane_ (EKS), se utilizará el objeto _AWSManagedControlPlane_. +- Para detallar los nodos _workers_ se utilizarán _MachineDeployment_, _EKSConfigTemplate_ y _AWSMachineTemplate_. +- Para indicar los parámetros del _self-healing_, se utiliza un _MachineHealthCheck_ para todo el _cluster_. + +===== GCP + +- La definición del cluster se hace con los objetos _Cluster_ y _GCPCluster_. +- Para la definición de los nodos del _control-plane_, se utilizarán _KubeadmControlPlane_ y _GCPMachineTemplate_. +- Para detallar los nodos _workers_ se utilizarán _MachineDeployment_, _KubeadmConfigTemplate_ y _GCPMachineTemplate_. +- Para indicar los parámetros del _self-healing_, se utilizan dos _MachineHealthCheck_, uno para _workers_ y otro para el _control-plane_. + +===== Azure no-gestionado + +- La definición del cluster se hace con los objetos _Cluster_ y _AzureCluster_. +- Para la definición de los nodos del _control-plane_, se utilizarán _KubeadmControlPlane_ y _AzureMachineTemplate_. +- Para detallar los nodos _workers_ se utilizarán _MachineDeployment_, _KubeadmConfigTemplate_ y _AzureMachineTemplate_. +- Para indicar los parámetros del _self-healing_, se utilizan dos _MachineHealthCheck_, uno para _workers_ y otro para el _control-plane_. + +===== AKS + +- La definición del cluster se hace con los objetos _Cluster_ y _AzureManagedCluster_. +- Para definir parámetros del _control-plane_ (AKS), se utilizará el objeto _AzureManagedControlPlane_. +- Para detallar los nodos _workers_ se utilizarán _MachinePool_ y _AzureManagedMachinePool_. +- Para indicar los parámetros del _self-healing_, se utiliza un _MachineHealthCheck_ para todo el _cluster_. + +=== _Self-healing_ + +image::self-healing.png[] + +La capacidad de _self-healing_ del _cluster_ se gestiona por el objeto _MachineHealthCheck_: + +[source,bash] +---- +$ kubectl -n cluster-example get mhc -o yaml +... + spec: + clusterName: example + maxUnhealthy: 100% + nodeStartupTimeout: 5m0s + selector: + matchLabels: + keos.stratio.com/machine-role: example-worker-node + unhealthyConditions: + - status: Unknown + timeout: 1m0s + type: Ready + - status: "False" + timeout: 1m0s + type: Ready +... +---- + +NOTE: Los providers no-gestionados tendrán un MachineHealthCheck para el control-plane y otro para los nodos worker, mientras que los gestionados (EKS, AKS) sólo tendrán el segundo. + +==== Prueba de _failover_ en un nodo + +En caso de fallo en un nodo, éste será detectado por un _controller_ y se procederá al reemplazo del mismo, eliminándolo y volviendo a crear otro del mismo grupo, lo que asegura las mismas características. + +Para simular un fallo en una VM, se eliminará desde la consola web del proveedor de _Cloud_. + +La recuperación del nodo comprende las siguientes fases y tiempos estimados (pudiendo variar según el provider y flavour): + +[source,bash] +---- +. Terminate VM from console: 0s +. New VM is Provisioning: 50s +. Old Machine is Deleted & the new one is Provisioned: 1m5s +. New Machine is Running & new k8s node is NotReady: 1m 50s +. New k8s node is Ready: 2m +---- + +=== Escalado estático + +Aunque se desaconseja el escalado manual de un grupo de nodos existente, se presentan estas operaciones para casos sin autoescalado o nuevos grupos de nodos. + +==== Escalar un grupo de _workers_ + +image::escalado-manual.png[] + +Para escalar manualmente un grupo de _workers_, se usa el objeto _MachineDeployment_, que soporta el comando _scale_ de kubectl: + +[source,bash] +---- +kubectl -n cluster-example-eks scale --replicas 3 MachineDeployment --all +---- + +Vemos el nuevo número de réplicas y los nuevos objetos Machine: + +[source,bash] +---- +kubectl -n cluster-example-eks get MachineDeployment +kubectl -n cluster-example-eks get Machine +---- + +===== AKS + +El comando "scale" utilizado para el resto de providers, no realiza ninguna acción en los MachinePools. + +A su vez, si se cambian las réplicas del objeto MachinePool a mano, éste pasara a estado "Scaling" y volverá al número de répicas anterior, dejando sin efecto el cambio. + +NOTE: Los objetos _MachinePools_ del APIserver se corresponden en Azure a _Node pools_ dentro de AKS y sus correspondientes _VM Scale Sets_. + +El escalado manual de un grupo de nodos en AKS se deberá hacer desde el portal de Azure en: + +_VM Scale set -> -> Scalling -> _ + +o bien desde: + +_Kubernetes services_ -> -> Node pools -> -> Scale node pool -> Manual -> + +Las nuevas instancias se pueden ver en _VM Scale set -> Instances_. Para ver las nuevas instancias en el APIserver, hay que consultar el status del objeto MachinePool: + +[source,bash] +---- +kubectl -n cluster-stg-aks get mp -o json | jq -r .status.nodeRefs[].name +---- +Una vez escalado el VM Scale set, se agrega la nueva VM como nodo de k8s y se actualiza el objeto MachinePool con el nuevo numero de instancias. Los tiempos estimados de este proceso son los siguientes: + +[source,bash] +---- +Scale VM Scale set: 0s +New K8s node is NotReady: 1m +New K8s node is Ready: 1m 13s +The MachinePool Scaling: 1m 29s +The MachinePool is updated: 1m 33s +---- + +==== Crear un nuevo grupo de _workers_ + +===== EKS + +En EKS se deberán crear los siguientes tres objetos: _MachineDeployment_, _AWSMachineTemplate_ y _EKSConfigTemplate_. + +Una vez confeccionado el _manifest_, la creación del grupo consiste simplemente en aplicarlo al _cluster_ de la siguiente forma: + +[source,bash] +---- +kubectl apply -f xref:attachment$example-eks-md.yaml[example-eks-md.yaml] +---- + +Para ver los objetos creados: + +[source,bash] +---- +kubectl -n cluster-example get md,eksct,awsmt +---- + +===== GCP y Azure + +Para el caso de estos providers, se crearán: _MachineDeployment_, _MachineTemplate_ y _KubeadmConfigTemplate_. + +[.underline]#Ejemplo para GCP:# + +Creación de un nuevo grupo de _workers_ a partir de un _manifest_: + +[source,bash] +---- +kubectl apply -f xref:attachment$example-gcp-md.yaml[example-gcp-md.yaml] +---- + +Para ver los objetos creados (para cada provider): + +[source,bash] +---- +kubectl -n cluster-example get md,gcpmachinetemplate,kubeadmconfigtemplate + +kubectl -n cluster-example get md,azuremachinetemplate,kubeadmconfigtemplate +---- + +===== AKS + +En AKS se deberán crear los objetos: _MachinePool_ y _AzureManagedMachinePool_. + +Una vez confeccionado el _manifest_, la creación del grupo consiste simplemente en aplicarlo al _cluster_ de la siguiente forma: + +[source,bash] +---- +kubectl apply -f xref:attachment$example-aks-md.yaml[example-aks-md.yaml] +---- + +Para ver los objetos creados: + +[source,bash] +---- +kubectl -n cluster-example get mp,ammp +---- + +==== Escalado vertical + +CAUTION: *AKS no soporta escalado vertical* de los grupos de nodos. Para este provider se deberá crear un grupo nuevo y eliminar el anterior como lo indica la https://learn.microsoft.com/en-us/azure/aks/resize-node-pool[documentación oficial]. + +El escalado vertical de un grupo de nodos puede realizarse de varias formas, todas ellas comenzarán por cambiar el tipo de instancia del objeto `MachineTemplate`. + +TIP: A pesar de que oficialmente se indica que se cree un nuevo `MachineTemplate` y se referencie desde el _MachineDeployment_, no se recomienda esta opción porque impide mantener la consistencia de nombres entre los objetos que gestionan los grupos de nodos. + +El método recomendado se basa en 3 simples pasos: + +1. Indicar el nuevo tipo de instancia en `MachineTemplate` (_spec.template.spec.instanceType_). En algunos proveedores, este objeto deberá eliminarse y volver a crearse. +2. Obtener la versión del nuevo objeto `MachineTemplate` (_metadata.resourceVersion_). +3. Editar el _MachineDeployment_ actualizando la versión obtenida en el paso anterior (_spec.template.spec.infrastructureRef.resourceVersion_). + +===== EKS + +Como ejemplo, para un _cluster_ de EKS se haría de la siguiente forma: + +[source,bash] +---- +$ export MACHINE_TYPE="t3.medium" +$ export MACHINE_DEPLOYMENT="example-eks-xlarge-md-2" +$ export NAMESPACE="cluster-example-eks" + +$ kubectl -n $NAMESPACE patch MachineTemplate $MACHINE_DEPLOYMENT --type merge -p "{\"spec\": {\"template\": {\"spec\": {\"instanceType\": \"$MACHINE_TYPE\"}}}}" + +$ RESOURCE_VERSION=$(kubectl -n $NAMESPACE get MachineTemplate $MACHINE_DEPLOYMENT -o json | jq -r .metadata.resourceVersion) + +$ kubectl -n $NAMESPACE patch MachineDeployment $MACHINE_DEPLOYMENT --type merge -p "{\"spec\": {\"template\": {\"spec\": {\"infrastructureRef\": {\"resourceVersion\": \"$RESOURCE_VERSION\"}}}}}" +---- + +===== GCP y Azure no-gestionado + +Para estos providers, el procedimiento es muy similar al de EKS pero varía en que el objeto MachineTemplate no se puede editar, teniendo que eliminarlo y crear uno nuevo. + +[source,bash] +---- +$ export MACHINE_TYPE="t3.medium" +$ export MACHINE_DEPLOYMENT="example-eks-xlarge-md-2" +$ export NAMESPACE="cluster-example-eks" +$ export PROVIDER_NAME="gcp" + +$ kubectl -n $NAMESPACE get ${PROVIDER_NAME}machinetemplate $MACHINE_DEPLOYMENT -o yaml > /tmp/$MACHINE_DEPLOYMENT_gcpmt.yaml +$ sed -i "s/ instanceType:.*/ instanceType: $MACHINE_TYPE/" /tmp/$MACHINE_DEPLOYMENT_gcpmt.yaml +$ kubectl delete -f /tmp/$MACHINE_DEPLOYMENT_gcpmt.yaml +$ kubectl apply -f /tmp/$MACHINE_DEPLOYMENT_gcpmt.yaml + +$ RESOURCE_VERSION=$(kubectl -n $NAMESPACE get ${PROVIDER_NAME}MachineTemplate $MACHINE_DEPLOYMENT -o json | jq -r .metadata.resourceVersion) + +$ kubectl -n $NAMESPACE patch MachineDeployment $MACHINE_DEPLOYMENT --type merge -p "{\"spec\": {\"template\": {\"spec\": {\"infrastructureRef\": {\"resourceVersion\": \"$RESOURCE_VERSION\"}}}}}" +---- + +=== Autoescalado + +image::autoescalado.png[] + +Para el autoescalado de nodos, se utiliza _cluster-autoscaler_, quien detectará _pods_ pendientes de ejecutar por falta de recursos y escalará el grupo de nodos que considere según los filtros de los despliegues. + +Esta operación se realiza en el APIserver, siendo los _controllers_ los encargados de crear las VMs en el proveedor de _Cloud_ y agregarlas al _cluster_ como nodos _workers_ de Kubernetes. + +Dado que el autoescalado está basado en el _cluster-autoscaler_, se añadirá el mínimo y máximo en el grupo de nodos _workers_ como _annotations_: + +[source,bash] +---- +$ kubectl -n cluster-example-eks edit MachineDeployment demo-eks-md-2 + +- apiVersion: cluster.x-k8s.io/v1beta1 + kind: MachineDeployment + metadata: + annotations: + cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: "6" + cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: "2" + ... +---- + +===== AKS + +En este provider, el autoescalado se getiona desde los _VM Scale sets_ de Azure y no con el cluster-autoscaler. + +Durante el aprovisionamiento, en el momento de crear los grupos de nodos y como se ha mencionado anteriormente, se crearán los _MachinePools_ y a raíz de ello, se instanciarán los _Node pools_ en AKS y sus respectivos _VM Scale Sets_. Si los grupos de nodos definidos tienen un rango de autoescalado, éstos se trasladarán a los _Node pools_ creados. + +Para verlos en el portal de Azure, se deberá consultar: + +_Kubernetes services_ -> -> Node pools -> -> Scale node pool -> Autoscale + +==== Prueba + +Para probar el autoescalado, se puede crear un _Deployment_ con suficientes réplicas de modo que no se puedan ejecutar en los nodos actuales: + +[source,bash] +---- +$ kubectl create deploy test --replicas 1500 --image nginx:alpine +---- + +Al terminar la prueba, se elimina el _Deployment_: + +[source,bash] +---- +$ kubectl --kubeconfig demo-eks.kubeconfig delete deploy test +---- + +==== _Logs_ + +Los _logs_ del _cluster-autoscaler_ se pueden ver desde su _Deployment_: + +[source,bash] +---- +$ kubectl -n kube-system logs -f -l app.kubernetes.io/name=clusterapi-cluster-autoscaler +---- + +=== Actualización de Kubernetes + +La actualización del _cluster_ a una versión superior de Kubernetes se realizará en dos partes, primero el _control-plane_ y, una vez que esté en la nueva versión, se procederá a la actualización de los nodos _workers_. + +CAUTION: La actualización de la version de Kubernetes de los nodos en los clusters donde no se haya especificado la imágen, puede implicar una actualización del Sistema Operativo. + +==== _Control-plane_ + +image::upgrade-cp.png[] + +El upgrade de un cluster en entornos productivos, y especialmente en flavours no-gestionados, deberá hacerse extremando todas las precauciones. En particular, antes del upgrade del cluster, se recomienda realizar un backup de los objetos que gestionan la infraestructura con el siguiente comando: + +[source,bash] +---- +$ clusterctl --kubeconfig ./kubeconfig/path move -n cluster- --to-directory ./backup/path/ +---- + +En el caso de _control-plane_ gestionados, se deberá verificar que la versión deseada de Kubernetes está soportada por el provider. + +===== EKS + +Previo a la actualización de EKS, debemos asegurar que la versión deseada está soportada, para ello, podemos utilizar el siguiente comando: + +[source,bash] +---- +$ aws eks describe-addon-versions | jq -r ".addons[] | .addonVersions[] | .compatibilities[] | .clusterVersion" | sort -nr | uniq | head -4 +---- + +Para iniciar la actualización, se ejecutará un _patch_ de _spec.version_ en el objeto _AWSManagedControlPlane_. + +[source,bash] +---- +$ kubectl -n cluster-example patch AWSManagedControlPlane example-control-plane --type merge -p '{"spec": {"version": "v1.24.0"}}' +---- + +===== GCP y Azure no-gestionado + +La GlobalNetworkPolicy creada para el _control-plane_ en la fase de instalación de KEOS, se deberá modificar de modo que *permita toda la red de los nodos momentáneamente* mientras se ejecuta el upgrade. + +Una vez finalizada la actualización, se deberán actualizar las IPs internas de los nodos y las de tunel asignadas a dichos nodos: + +[source,bash] +---- +$ kubectl get nodes -l node-role.kubernetes.io/control-plane= -ojson | jq -r '.items[].status.addresses[] | select(.type=="InternalIP").address + "\/32"' +---- + +[source,bash] +---- +$ IPAMHANDLERS=$(kw get ipamhandles -oname | grep control-plane) +$ for handler in $IPAMHANDLERS; do kw get $handler -o json | jq -r '.spec.block | keys[]' | sed 's/\/.*/\/32/'; done +---- + +Una forma de asegurar que el etcd está correcto después de actualizar un _control-plane_ no-gestionado es abrir una terminal en cualquier Pod de etcd, ver el status del cluster y comparar las IPs de los miembros registrados con las IPs de los nodos del _control-plane_. + +[source,bash] +---- +$ k -n kube-system exec -ti etcd- sh + +$ alias e="etcdctl --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --cacert=/etc/kubernetes/pki/etcd/ca.crt " +$ e endpoint status +$ e endpoint status -w table --cluster +$ e member list +$ e member remove +---- + +===== AKS + +Al igual que para otros flavours gestionados, antes de lanzar la actualización de AKS debemos ver las versiones soportadas en la región utilizada. Para ello, se podrá usar su CLI: + +[source,bash] +---- +$ az aks get-versions --location --output table +---- + +Para actualizar AKS, modificaremos la version en el parámetro _spec.version_ del objeto _AzureManagedControlPlane_: + +[source,bash] +---- +$ kubectl -n cluster-example patch AzureManagedControlPlane example-control-plane --type merge -p '{"spec": {"version": "v1.24.0"}}' +---- + +==== _Workers_ + +image::upgrade-w.png[] + +Para cada grupo de nodos _workers_ del _cluster_, se ejecutará un _patch_ de _spec.template.spec.version_ en el objeto _MachineDeployment_ correspondiente al grupo. + +[source,bash] +---- +$ kubectl -n cluster-example patch MachineDeployment example-md-1 --type merge -p '{"spec": {"template": {"spec": {"version": "v1.24.0"}}}}' +---- + +NOTE: El _controller_ aprovisiona un nuevo nodo del grupo de _workers_ con la versión actualizada y, una vez que esté _Ready_ en Kubernetes, elimina un nodo con la versión vieja. De esta forma, asegura siempre el número de nodos configurado. + +===== AKS + +En el caso de AKS, se ejecutará un _patch_ de _spec.template.spec.version_ en el objeto _MachinePool_ correspondiente al grupo. + +. El MachinePool se quedar'a en estado Provisioned y desde el portal, el VM Scale Set desplegara una maquina nueva extra (se puede ver dentro del scale set, en instancias) y hara el rollout restart +. La VM aparecera en como nodo de kubernetes con la nueva version, y se eliminara el nodo de una vieja. El MachinePool se queda en Provisioned hasta que se actualicen todas las instancias +. Una vez actualizadas todas las instancias, el MachinePool vuelve a estado Running +. Curiosamente, al terminar de actualizar TODOS los nodos del scale set, elimina el que ha añadido nuevo, quedando la secuencia de instancias dentro del scale set (0,1,2,..). + +=== Eliminación del _cluster_ + +Previo a la eliminación de los recusos del proveedor _Cloud_ generados por el _cloud-provisioner_, se deberán eliminar aquellos que han sido creados por el _keos-installer_ o cualquier automatismo externo. + +. Se crea un _cluster_ local indicando que no se genere ningún objeto en el proveedor _Cloud_. ++ +[source,bash] +----- +[local]$ sudo ./bin/cloud-provisioner create cluster --name prod-cluster --descriptor cluster.yaml --vault-password --avoid-creation +----- ++ +. Se mueve la gestión del _cluster_ _worker_ al _cluster_ local, utilizando el _kubeconfig_ correspondiente (nótese que para los _control-planes_ gestionados se necesitará el _kubeconfig_ del proveedor). Para asegurar este paso, se buscará el siguiente texto en la salida del comando: *Moving Cluster API objects Clusters=1*. ++ +[source,bash] +----- +[local]$ sudo clusterctl --kubeconfig $KUBECONFIG move -n cluster-example-eks --to-kubeconfig /root/.kube/config +----- ++ +. Se accede al _cluster_ local y se elimina el _cluster_ _worker_. ++ +[source,bash] +----- +[local]$ sudo docker exec -ti example-eks-control-plane bash +root@example-eks-control-plane:/# kubectl -n cluster-example-eks delete cl --all +cluster.cluster.x-k8s.io "example-eks" deleted +root@example-eks-control-plane:/# +----- ++ +. Finalmente, se elimina el _cluster_ local. ++ +[source,bash] +----- +[local]$ sudo ./bin/cloud-provisioner delete cluster --name example-eks +----- diff --git a/stratio-docs/es/modules/ROOT/pages/quick-start-guide.adoc b/stratio-docs/es/modules/ROOT/pages/quick-start-guide.adoc new file mode 100644 index 0000000000..842c0838cf --- /dev/null +++ b/stratio-docs/es/modules/ROOT/pages/quick-start-guide.adoc @@ -0,0 +1,494 @@ += Guía de inicio rápido + +== EKS + +=== Prerrequisitos + +* Usuario con los privilegios necesarios en AWS: +** Crear usuario para la instalación. +** Crear política según xref:attachment$stratio-eks-policy.json[_stratio-eks-policy.json_]. +** Crear política según xref:attachment$stratio-aws-temp-policy.json[_stratio-temp-policy.json_] (sólo para el aprovisionamiento). +** Adjuntar políticas al usuario. +** Crear una clave de acceso. +* Zonas DNS privadas y públicas creadas en AWS (opcional). +* Infraestructura personalizada creada en AWS (opcional). +* Componer el fichero descriptor del _cluster_. +** Credenciales del usuario (_access$$_$$key_ y _secret$$_$$key_) y datos de la cuenta (región y _account$$_$$id_), que se cifrarán en la primera ejecución. +** Token de GitHub para descargar plantillas. +** Datos de la cuenta (región y _account$$_$$id_). +** Datos de la infraestructura ya creada (opcional). +** Gestión de las zonas DNS creadas (opcional). +** URL de ECR. +** Dominio externo del _cluster_. +** Habilitar el _logging_ en EKS por componente (opcional). +** Grupos de nodos. +** Información necesaria para la instalación de _Stratio KEOS_. + +En cuanto al _control-plane_, en el descriptor del _cluster_ se puede indicar que se trata de un *_control-plane_ gestionado* y los _logs_ que se quieren activar del mismo (_APIserver_, _audit_, _authenticator_, _controller$$_$$manager_ y/o _scheduler_). + +Asimismo, se pueden indicar *grupos de nodos _worker_* con las siguientes opciones: + +* _name_: nombre del grupo, no puede repetirse. +* _size_: tipo de instancia. +* _quantity_: cantidad de _workers_ en el grupo. +* _min$$_$$size_: número mínimo de nodos para el autoescalado (opcional). +* _max$$_$$size_: número máximo de nodos para el autoescalado (opcional). +* _labels_: etiquetas de los nodos en Kubernetes (opcional). +* _root$$_$$volume_: particularidades del disco (opcional). +** _size_: tamaño en GB (por defecto: 30GB). +** _type_: tipo de disco (por defecto: gp3). +** _encrypted_: cifrado del disco (por defecto: _false_). +* _ssh$$_$$key_: clave SSH para acceso a los nodos (opcional). Debe existir en el proveedor. +* _spot_: indica si la instancia es de tipo _spot_ (opcional). +* _node$$_$$image_: imagen de los nodos _worker_ (opcional). La imagen indicada deberá existir y ser compatible con EKS. +* _zone$$_$$distribution_: indica si la cantidad de nodos debe quedar balanceada en las zonas o no (por defecto: _balanced_). +* _az_: zona del grupo de _workers_ (opcional). En caso de especificarse, solamente se utilizará ésta para todo el grupo. Este parámetro invalida lo especificado en _zone$$_$$distribution_. + +NOTE: Por defecto, el reparto de nodos se hará en las zonas a, b y c de la región indicada de forma balanceada, por lo tanto, el resto de la división por tres de la cantidad de nodos se descartará. Ejemplo: si se indica 'quantity=7', sólo se desplegarán 2 nodos en cada una de las zonas. + +==== _keos-installer_ + +A modo de facilitar la instalación de _Stratio KEOS_, en el proceso de provisión se genera un fichero _keos.yaml_ funcional y listo para poder lanzar la instalación. Para ello, en el descriptor del _cluster_ se podrá indicar la versión y _flavour_ (_production_, _development_ o _minimal_). + +[source,bash] +---- + keos: + version: 0.8.1 + flavour: development +---- + +Para cualquier personalización extra, deberá modificarse el fichero antes de ejecutar el _keos-installer_. + +==== Consideraciones + +* En caso de utilizar infraestructura personalizada, se deberá indicar la VPC y 3 _subnets_. +* La versión de Kubernetes indicada debe estar soportada por EKS. +* Los nombres de los grupos de _worker$$_$$nodes_ no pueden repetirse. + +TIP: Para más detalles, consulta la xref:ROOT:installation.adoc[guía de instalación]. + +=== Instalación + +Esta fase (aprovisionamiento e instalación de Kubernetes), deberá ejecutarse desde una máquina Linux con acceso a internet y un Docker instalado. + +Una vez descargado el fichero `.tgz` del _cloud-provisioner_, se procederá a descomprimirlo y ejecutarlo con los parámetros de creación: + +[source,bash] +---- +$ tar xvzf cloud-provisioner-*tar.gz +$ sudo ./bin/cloud-provisioner create cluster --name --descriptor cluster.yaml +Creating temporary cluster "example-eks" ... + ✓ Ensuring node image (kindest/node:v1.24.7) 🖼 + ✓ Building Stratio image (stratio-capi-image:v1.24.7) 📸 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 + ✓ Installing CAPx 🎖️ + ✓ Generating workload cluster manifests 📝 + ✓ Generating secrets file 📝🗝️ + ✓ [CAPA] Ensuring IAM security 👮 + ✓ Creating the workload cluster 💥 + ✓ Saving the workload cluster kubeconfig 📝 + ✓ Preparing nodes in workload cluster 📦 + ✓ Installing StorageClass in workload cluster 💾 + ✓ Enabling workload cluster's self-healing 🏥 + ✓ Installing CAPx in workload cluster 🎖️ + ✓ Installing Network Policy Engine in workload cluster 🚧 + ✓ Adding Cluster-Autoescaler 🗚 + ✓ Creating cloud-provisioner Objects backup 🗄️ + ✓ Moving the management role 🗝️ + ✓ Generating the KEOS descriptor 📝 + ✓ Cleaning up temporary cluster 🧹 + +The cluster has been installed, please refer to _Stratio KEOS_ documentation on how to proceed. +---- + +=== Siguientes pasos + +En este punto, habrá un _cluster_ de Kubernetes con las características indicadas en el descriptor y se podrá acceder al API Server de EKS con el CLI de AWS como lo indica en https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html[la documentación oficial]. + +[source,bash] +---- +$ aws eks update-kubeconfig --region --name --kubeconfig ./.kubeconfig + +$ kubectl --kubeconfig ./.kubeconfig get nodes +---- + +Aquí, se podrán eliminar los permisos de _clusterawsadm.json_. + +A continuación, se procederá a desplegar _Stratio KEOS_ *utilizando _keos-installer_*. + + +== GCP + +=== Prerrequisitos + + +* Usuario con los privilegios necesarios en GCP: +** Crear una _IAM Service Account_ con los permisos definidos en xref:attachment$stratio-gcp-permissions.list[stratio-gcp-permissions.list]. +** Crear una clave privada para la _IAM Service Account_ de tipo JSON y descargarla en un fichero `-.json`. Estos datos se utilizarán para las credenciales solicitadas en el descriptor del _cluster_. +* Desplegar un "Cloud NAT" en la región (requiere un "Cloud Router", pero se puede crear en el propio _wizard_). +* Zonas DNS privadas y públicas creadas en GCP (opcional). +* Infraestructura personalizada creada en GCP (opcional). +* Componer el fichero descriptor del _cluster_. +** Credenciales del usuario (_private$$_$$key$$_$$id_, _private$$_$$key_ y _client$$_$$email_) y datos de la cuenta (región y _project$$_$$id_), que se cifrarán en la primera ejecución. +** Token de GitHub para la descarga de plantillas. +** Datos de la infraestructura ya creada (opcional). +** Gestión de las zonas DNS creadas (opcional). +** Datos del _Docker registry_ (URL, credenciales). +** Dominio externo del _cluster_. +** Control Plane. +** Grupos de nodos. +** Información necesaria para la instalación de _Stratio KEOS_. + +NOTE: La instalación requiere una imagen custom de Ubuntu 22.04 con parametros necesarios por Elasticsearch. + +==== Nodos _control-plane_ + +Para este proveedor, el _control-plane_ se desplegará en máquinas virtuales, por ello, se podrán configurar las siguientes opciones: + +* _highly$$_$$available_: define si el _control-plane_ contará con alta disponibilidad (por defecto: _true_). +* _managed_: indica que se trata de un _control-plane_ en máquinas virtuales. +* _size_: tipo de instancia. +* _node$$_$$image_: imagen de los nodos del _control-plane_. La imagen indicada deberá existir en el proyecto referenciado. +* _root$$_$$volume_: particularidades del disco (opcional). +** _size_: tamaño en GB (por defecto: 30GB). +** _type_: tipo de disco (por defecto: gp3). +** _encrypted_: cifrado del disco (por defecto: _false_). + +==== Nodos _worker_ + +En el descriptor del _cluster_ se pueden indicar grupos de nodos _worker_ con las siguientes opciones: + +* _name_: nombre del grupo, no puede repetirse. +* _size_: tipo de instancia. +* _quantity_: cantidad de _workers_ en el grupo. +* _min$$_$$size_: número mínimo de nodos para el autoescalado (opcional). +* _max$$_$$size_: número máximo de nodos para el autoescalado (opcional). +* _labels_: etiquetas de los nodos en Kubernetes (opcional). +* _root$$_$$volume_: particularidades del disco (opcional). +** _size_: tamaño en GB (por defecto: 30GB). +** _type_: tipo de disco (por defecto: gp3). +** _encrypted_: cifrado del disco (por defecto: _false_). +* _ssh$$_$$key_: clave SSH para acceso a los nodos (opcional). Debe existir en el proveedor. +* _spot_: indica si la instancia es de tipo _spot_ (opcional). +* _node$$_$$image_: imagen de los nodos _worker_. La imagen indicada deberá existir en el proyecto referenciado. +* _zone$$_$$distribution_: indica si la cantidad de nodos debe quedar balanceada en las zonas o no (por defecto: _balanced_). +* _az_: zona del grupo de _workers_ (opcional). En caso de especificarse, solamente se utilizará ésta para todo el grupo. Este parámetro invalida lo especificado en _zone$$_$$distribution_. + +NOTE: Por defecto, el reparto de nodos se hará en las zonas a, b y c de la región indicada de forma balanceada, por lo tanto, el resto de la división por tres de la cantidad de nodos se descartará. Ejemplo: si se indica 'quantity=7', sólo se desplegarán 2 nodos en cada una de las zonas. + +==== _keos-installer_ + +A modo de facilitar la instalación de _Stratio KEOS_, en el proceso de provisión se genera un fichero _keos.yaml_ funcional y listo para poder lanzar la instalación. Para ello, en el descriptor del _cluster_ se podrá indicar la versión y _flavour_ (_production_, _development_ o _minimal_). + +[source,bash] +---- + keos: + version: 0.8.1 + flavour: development +---- + +Para cualquier personalización extra, deberá modificarse el fichero antes de ejecutar el _keos-installer_. + +==== Consideraciones + +* En caso de utilizar una infraestructura personalizada, se deberá indicar la VPC y 3 _subnets_. +* La versión de Kubernetes configurada debe ser la soportada en las imágenes indicadas. +* Los nombres de los grupos de _worker$$_$$nodes_ no pueden repetirse. + +TIP: Para más detalles, consulta la xref:ROOT:installation.adoc[guía de instalación]. + +=== Instalación + +Esta fase (aprovisionamiento e instalación de Kubernetes), deberá ejecutarse desde una máquina Linux con acceso a internet y un Docker instalado. + +Una vez descargado el fichero `.tgz` del _cloud-provisioner_, se procederá a descomprimirlo y ejecutarlo con los parámetros de creación: + +[source,bash] +---- +$ tar xvzf cloud-provisioner-*tar.gz +$ sudo ./bin/cloud-provisioner create cluster --name --descriptor cluster.yaml +Creating temporary cluster "example-gcp" ... + ✓ Ensuring node image (kindest/node:v1.24.7) 🖼 + ✓ Building Stratio image (stratio-capi-image:v1.24.7) 📸 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 + ✓ Installing CAPx 🎖️ + ✓ Generating workload cluster manifests 📝 + ✓ Generating secrets file 📝🗝️ + ✓ Creating the workload cluster 💥 + ✓ Saving the workload cluster kubeconfig 📝 + ✓ Installing Calico in workload cluster 🔌 + ✓ Installing StorageClass in workload cluster 💾 + ✓ Preparing nodes in workload cluster 📦 + ✓ Installing StorageClass in workload cluster 💾 + ✓ Enabling workload cluster's self-healing 🏥 + ✓ Installing CAPx in workload cluster 🎖️ + ✓ Adding Cluster-Autoescaler 🗚 + ✓ Creating cloud-provisioner Objects backup 🗄️ + ✓ Moving the management role 🗝️ + ✓ Generating the KEOS descriptor 📝 + ✓ Cleaning up temporary cluster 🧹 + +The cluster has been installed, please refer to _Stratio KEOS_ documentation on how to proceed. +---- + +=== Siguientes pasos + +En este punto, habrá un _cluster_ de Kubernetes con las características indicadas en el descriptor y se podrá acceder al APIserver con el _kubeconfig_ generado en el directorio actual (_.kube/config_): + +[source,bash] +---- +$ kubectl --kubeconfig .kube/config get nodes +---- + +A continuación, se procederá a desplegar _Stratio KEOS_ *utilizando keos-installer*. + + +== Azure no-gestionado + +=== Prerrequisitos + +* Usuarios con los privilegios necesarios en Azure: +** Crear una _Managed Identity_ con los roles: Contributor, AcrPull (sobre el ACR del cluster, opcional) y Managed Identity Operator. La referencia de esta identidad (Resource ID) se utilizará en el descriptor del _cluster_ (formato _/subscriptions//resourcegroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/_). +** Crear una _App registration_ (creará una _Enterprise application_) y generar un _client secret_. El valor del _client secret_ y su _Secret ID_ se utilizarán para las credenciales solicitadas en el descriptor del _cluster_. +* Zonas DNS privadas y públicas creadas en Azure (opcional). +* Infraestructura personalizada creada en Azure (opcional). +* Componer el fichero descriptor del _cluster_. +** Credenciales del usuario (_client$$_$$id_ y _client$$_$$secret_) y datos de la cuenta ( _subscription$$_$$id_ y _tenant$$_$$id_), que se cifrarán en la primera ejecución. +** Token de GitHub para la descarga de plantillas (opcional). +** Datos de la infraestructura ya creada (opcional). +** Gestión de las zonas DNS creadas (opcional). +** Datos del _Docker registry_ (URL, credenciales). +** Dominio externo del _cluster_. +** Control Plane. +** Grupos de nodos. +** Información necesaria para la instalación de _Stratio KEOS_. + +NOTE: La instalación requiere una imagen custom de Ubuntu 22.04 con parametros necesarios por Elasticsearch. + +==== Nodos _control-plane_ + +Para este proveedor, el _control-plane_ se desplegará en máquinas virtuales, por ello, se podrán configurar las siguientes opciones: + +* _highly$$_$$available_: define si el _control-plane_ contará con alta disponibilidad (por defecto: _true_). +* _managed_: indica que se trata de un _control-plane_ en máquinas virtuales. +* _size_: tipo de instancia. +* _node$$_$$image_: imagen de los nodos del _control-plane_ (opcional). La imagen indicada deberá existir en la cuenta. +* _root$$_$$volume_: particularidades del disco (opcional). +** _size_: tamaño en GB (por defecto: 30GB). +** _type_: tipo de disco (por defecto: gp3). +** _encrypted_: cifrado del disco (por defecto: _false_). + +==== Nodos _worker_ + +En el descriptor del _cluster_ se pueden indicar grupos de nodos _worker_ con las siguientes opciones: + +* _name_: nombre del grupo, no puede repetirse. +* _size_: tipo de instancia. +* _quantity_: cantidad de _workers_ en el grupo. +* _min$$_$$size_: número mínimo de nodos para el autoescalado (opcional). +* _max$$_$$size_: número máximo de nodos para el autoescalado (opcional). +* _labels_: etiquetas de los nodos en Kubernetes (opcional). +* _root$$_$$volume_: particularidades del disco (opcional). +** _size_: tamaño en GB (por defecto: 30GB). +** _type_: tipo de disco (por defecto: gp3). +** _encrypted_: cifrado del disco (por defecto: _false_). +* _ssh$$_$$key_: clave SSH para acceso a los nodos (opcional). Debe existir en el proveedor. +* _spot_: indica si la instancia es de tipo _spot_ (opcional). +* _node$$_$$image_: imagen de los nodos _worker_ (opcional). La imagen indicada deberá existir en la cuenta. +* _zone$$_$$distribution_: indica si la cantidad de nodos debe quedar balanceada en las zonas o no (por defecto: _balanced_). +* _az_: zona del grupo de _workers_ (opcional). En caso de especificarse, solamente se utilizará ésta para todo el grupo. Este parámetro invalida lo especificado en _zone$$_$$distribution_. + +NOTE: Por defecto, el reparto de nodos se hará en las zonas a, b y c de la región indicada de forma balanceada, por lo tanto, el resto de la división por tres de la cantidad de nodos se descartará. Ejemplo: si se indica 'quantity=7', sólo se desplegarán 2 nodos en cada una de las zonas. + +==== _keos-installer_ + +A modo de facilitar la instalación de _Stratio KEOS_, en el proceso de provisión se genera un fichero _keos.yaml_ funcional y listo para poder lanzar la instalación. Para ello, en el descriptor del _cluster_ se podrá indicar la versión y _flavour_ (_production_, _development_ o _minimal_). + +[source,bash] +---- + keos: + version: 0.8.1 + flavour: development +---- + +Para cualquier personalización extra, deberá modificarse el fichero antes de ejecutar el _keos-installer_. + +==== Consideraciones + +* En caso de utilizar una infraestructura personalizada, se deberá indicar la VPC y 3 _subnets_. +* La versión de Kubernetes configurada debe ser la soportada en las imágenes indicadas (opcional). +* Los nombres de los grupos de _worker$$_$$nodes_ no pueden repetirse. + +TIP: Para más detalles, consulta la xref:ROOT:installation.adoc[guía de instalación]. + +=== Instalación + +Esta fase (aprovisionamiento e instalación de Kubernetes), deberá ejecutarse desde una máquina Linux con acceso a internet y un Docker instalado. + +Una vez descargado el fichero `.tgz` del _cloud-provisioner_, se procederá a descomprimirlo y ejecutarlo con los parámetros de creación: + +[source,bash] +---- +$ tar xvzf cloud-provisioner-*tar.gz +$ sudo ./bin/cloud-provisioner create cluster --name --descriptor cluster.yaml +Creating temporary cluster "example-azure" ... + ✓ Ensuring node image (kindest/node:v1.27.0) 🖼 + ✓ Building Stratio image (stratio-capi-image:v1.27.0) 📸 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 + ✓ Installing CAPx 🎖️ + ✓ Generating workload cluster manifests 📝 + ✓ Generating secrets file 📝🗝️ + ✓ Creating the workload cluster 💥 + ✓ Saving the workload cluster kubeconfig 📝 + ✓ Installing cloud-provider in workload cluster ☁️ + ✓ Installing Calico in workload cluster 🔌 + ✓ Installing CSI in workload cluster 💾 + ✓ Installing StorageClass in workload cluster 💾 + ✓ Preparing nodes in workload cluster 📦 + ✓ Installing StorageClass in workload cluster 💾 + ✓ Enabling workload cluster's self-healing 🏥 + ✓ Installing CAPx in workload cluster 🎖️ + ✓ Adding Cluster-Autoescaler 🗚 + ✓ Creating cloud-provisioner Objects backup 🗄️ + ✓ Moving the management role 🗝️ + ✓ Generating the KEOS descriptor 📝 + ✓ Cleaning up temporary cluster 🧹 + +The cluster has been installed, please refer to _Stratio KEOS_ documentation on how to proceed. +---- + +=== Siguientes pasos + +En este punto, habrá un _cluster_ de Kubernetes con las características indicadas en el descriptor y se podrá acceder al APIserver con el _kubeconfig_ generado en el directorio actual (_.kube/config_): + +[source,bash] +---- +$ kubectl --kubeconfig .kube/config get nodes +---- + +A continuación, se procederá a desplegar _Stratio KEOS_ *utilizando keos-installer*. + + +== AKS + +=== Prerrequisitos + +* Usuarios con los privilegios necesarios en Azure: +** Crear una _Managed Identity_ con los roles: Contributor, AcrPull (sobre el ACR del cluster, opcional) y Managed Identity Operator. La referencia de esta identidad (Resource ID) se utilizará en el descriptor del _cluster_ (formato _/subscriptions//resourcegroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/_). +** Crear una _App registration_ (creará una _Enterprise application_) y generar un _client secret_. El valor del _client secret_ y su _Secret ID_ se utilizarán para las credenciales solicitadas en el descriptor del _cluster_. +* Zonas DNS privadas y públicas creadas en Azure (opcional). +* Infraestructura personalizada creada en Azure (opcional). +* Componer el fichero descriptor del _cluster_. +** Credenciales del usuario (_client$$_$$id_ y _client$$_$$secret_) y datos de la cuenta ( _subscription$$_$$id_ y _tenant$$_$$id_), que se cifrarán en la primera ejecución. +** Token de GitHub para la descarga de plantillas (opcional). +** Datos de la infraestructura ya creada (opcional). +** Gestión de las zonas DNS creadas (opcional). +** URL de ACR. +** Dominio externo del _cluster_. +** _Tier_ de AKS (Free o Paid). +** Grupos de nodos. +** Información necesaria para la instalación de _Stratio KEOS_. + +NOTE: La instalación requiere una imagen custom de Ubuntu 22.04 con parametros necesarios por Elasticsearch. + +En cuanto al _control-plane_, en el descriptor del _cluster_ se puede indicar que se trata de un *_control-plane_ gestionado* y el Tier de AKS que se quiere instanciar. + +Asimismo, se pueden indicar *grupos de nodos _worker_* con las siguientes opciones: + +* _name_: nombre del grupo, no puede repetirse. +* _size_: tipo de instancia. +* _quantity_: cantidad de _workers_ en el grupo. +* _min$$_$$size_: número mínimo de nodos para el autoescalado (opcional). +* _max$$_$$size_: número máximo de nodos para el autoescalado (opcional). +* _labels_: etiquetas de los nodos en Kubernetes (opcional). +* _root$$_$$volume_: particularidades del disco (opcional). +** _size_: tamaño en GB (por defecto: 30GB). +** _type_: tipo de disco (por defecto: gp3). +** _encrypted_: cifrado del disco (por defecto: _false_). +* _ssh$$_$$key_: clave SSH para acceso a los nodos (opcional). Debe existir en el proveedor. +* _spot_: indica si la instancia es de tipo _spot_ (opcional). +* _node$$_$$image_: imagen de los nodos _worker_ (opcional). La imagen indicada deberá existir y ser compatible con AKS. +* _zone$$_$$distribution_: indica si la cantidad de nodos debe quedar balanceada en las zonas o no (por defecto: _balanced_). +* _az_: zona del grupo de _workers_ (opcional). En caso de especificarse, solamente se utilizará ésta para todo el grupo. Este parámetro invalida lo especificado en _zone$$_$$distribution_. + +NOTE: Por defecto, el reparto de nodos se hará en las zonas a, b y c de la región indicada de forma balanceada, por lo tanto, el resto de la división por tres de la cantidad de nodos se descartará. Ejemplo: si se indica 'quantity=7', sólo se desplegarán 2 nodos en cada una de las zonas. + +==== _keos-installer_ + +A modo de facilitar la instalación de _Stratio KEOS_, en el proceso de provisión se genera un fichero _keos.yaml_ funcional y listo para poder lanzar la instalación. Para ello, en el descriptor del _cluster_ se podrá indicar la versión y _flavour_ (_production_, _development_ o _minimal_). + +[source,bash] +---- + keos: + version: 0.8.1 + flavour: development +---- + +Para cualquier personalización extra, deberá modificarse el fichero antes de ejecutar el _keos-installer_. + +==== Consideraciones + +* En caso de utilizar infraestructura personalizada, se deberá indicar la VPC y 3 _subnets_. +* La versión de Kubernetes indicada debe estar soportada por AKS. +* Los nombres de los grupos de _worker$$_$$nodes_ no pueden repetirse. + +TIP: Para más detalles, consulta la xref:ROOT:installation.adoc[guía de instalación]. + +=== Instalación + +Esta fase (aprovisionamiento e instalación de Kubernetes), deberá ejecutarse desde una máquina Linux con acceso a internet y un Docker instalado. + +Una vez descargado el fichero `.tgz` del _cloud-provisioner_, se procederá a descomprimirlo y ejecutarlo con los parámetros de creación: + +[source,bash] +---- +$ tar xvzf cloud-provisioner-*tar.gz +$ sudo ./bin/cloud-provisioner create cluster --name --descriptor cluster.yaml +Creating temporary cluster "example-eks" ... + ✓ Ensuring node image (kindest/node:v1.27.0) 🖼 + ✓ Building Stratio image (stratio-capi-image:v1.27.0) 📸 + ✓ Preparing nodes 📦 + ✓ Writing configuration 📜 + ✓ Starting control-plane 🕹️ + ✓ Installing CNI 🔌 + ✓ Installing StorageClass 💾 + ✓ Installing CAPx 🎖️ + ✓ Generating workload cluster manifests 📝 + ✓ Generating secrets file 📝🗝️ + ✓ Creating the workload cluster 💥 + ✓ Saving the workload cluster kubeconfig 📝 + ✓ Preparing nodes in workload cluster 📦 + ✓ Installing StorageClass in workload cluster 💾 + ✓ Enabling workload cluster's self-healing 🏥 + ✓ Installing CAPx in workload cluster 🎖️ + ✓ Installing Network Policy Engine in workload cluster 🚧 + ✓ Creating cloud-provisioner Objects backup 🗄️ + ✓ Moving the management role 🗝️ + ✓ Generating the KEOS descriptor 📝 + ✓ Cleaning up temporary cluster 🧹 + +The cluster has been installed, please refer to _Stratio KEOS_ documentation on how to proceed. +---- + +=== Siguientes pasos + +En este punto, habrá un _cluster_ de Kubernetes con las características indicadas en el descriptor y se podrá acceder al APIserver con el _kubeconfig_ generado en el directorio actual (_.kube/config_): + +[source,bash] +---- +$ kubectl --kubeconfig .kube/config get nodes +---- + +A continuación, se procederá a desplegar _Stratio KEOS_ *utilizando keos-installer*.