{"id":15322640,"url":"https://github.com/dbgjerez/kops-aws","last_synced_at":"2025-07-20T01:05:35.284Z","repository":{"id":49755397,"uuid":"475375620","full_name":"dbgjerez/kops-aws","owner":"dbgjerez","description":"An example how to create a mini kubernetes cluster on aws","archived":false,"fork":false,"pushed_at":"2022-07-26T06:52:47.000Z","size":21,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-15T02:43:02.586Z","etag":null,"topics":["aws","kops","kubernetes"],"latest_commit_sha":null,"homepage":"https://blog.dbgjerez.es/posts/kops-aws/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dbgjerez.png","metadata":{"files":{"readme":"README.es.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-03-29T09:41:41.000Z","updated_at":"2022-08-10T15:37:47.000Z","dependencies_parsed_at":"2022-09-10T13:51:04.969Z","dependency_job_id":null,"html_url":"https://github.com/dbgjerez/kops-aws","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dbgjerez/kops-aws","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dbgjerez%2Fkops-aws","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dbgjerez%2Fkops-aws/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dbgjerez%2Fkops-aws/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dbgjerez%2Fkops-aws/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dbgjerez","download_url":"https://codeload.github.com/dbgjerez/kops-aws/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dbgjerez%2Fkops-aws/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266052532,"owners_count":23869474,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","kops","kubernetes"],"created_at":"2024-10-01T09:17:10.718Z","updated_at":"2025-07-20T01:05:35.256Z","avatar_url":"https://github.com/dbgjerez.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# kops-aws\nKops es una herramienta que nos facilita el aprovisionamiento de clúster de Kubernetes en diferentes proveedores cloud. \n\nEn este workshop mostraré cómo se puede realizar dicho despliegue, focalizando en desplegar un pequeño clúster para desarrollo. \n\n\u003e **AVISO** Para realizar el despliegue en un clúster en alta disponibilidad habría que hacer varios cambios, este caso es sólo para desarrollo.\n\n## Prerequisites\nKops permite el despliegue en diversos proveedores cloud. En este ejemplo vamos a utilizar AWS, por tanto: es importante tener una cuenta de AWS correctamente configurada:\n\n* [Cómo crear usuario admin](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials) (en caso de no tenerlo)\n* [Configuración de credencias para cli de AWS](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials)\n\nAdemás, es necesario instalar las siguiente heramientas:\n\n* Kops cli: [Descarga](https://kops.sigs.k8s.io/getting_started/install/)\n* AWS cli: [Documentación](https://aws.amazon.com/cli/)\n* Kubectl: [Download](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/)\n\n## Proceso\n\n### Usuario Kops\nEs recomendable crear un usuario de IAM aws para todo el proceso relacionado con Kops. Este usuario lo llamaramos ```kops```.\n\nEL usuario ```kops``` necesita los siguientes permisos de IAM:\n\n```properties\nAmazonEC2FullAccess\nAmazonRoute53FullAccess\nAmazonS3FullAccess\nIAMFullAccess\nAmazonVPCFullAccess\nAmazonSQSFullAccess\nAmazonEventBridgeFullAccess\n```\n\nPara crear el usuario desde linea de comandos podemos usar las siguientes instrucciones: \n\n```zsh\naws iam create-group --group-name kops\n\naws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops\naws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops\naws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops\naws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops\naws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess --group-name kops\naws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonSQSFullAccess --group-name kops\naws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEventBridgeFullAccess --group-name kops\n\naws iam create-user --user-name kops\n\naws iam add-user-to-group --user-name kops --group-name kops\n\naws iam create-access-key --user-name kops\n```\n\nUna vez el usuario ha sido creado, es importante guardar el  ```SecretAccessKey``` y ```AccessKeyID```. Con dichos parámetros, añade el usuario creado a tu fichero de credencias de AWS (```~/.aws/credentials```).\n\nAsegurate de seguir todo el proceso con el usuario ```kops```.\n\n```zsh\nAWS_PROFILE=kops\n```\n\n### Domain\nExisten muchas formas de configurar el DNS y dominio. La forma más sencilla es teniendo tu propio dominio hospedado en AWS. \n\nEn mi caso, tenía mi propio dominio en AWS desde hace tiempo. Tú puedes elegir la forma que más te convenga del siguiente listado: ([DNS y dominio](https://kops.sigs.k8s.io/getting_started/aws/#configure-dns)).\n\n### Estado\nKops guarda el estado del cluster en un bucket de s3.\n\nVamos a crear el bucket necesario en la región ```us-east-1``` tal y como recomienda la documentación oficial de Kops.\n\n\u003e **NOTE** Independientemente de la localización del bucket, el cluster podrá ser creado en cualquier región.\n\nAsignamos el nombre del bucket a una variable: \n\n```zsh\nBUCKET_NAME=k8s.dborrego.example\n```\n\nCreamos el bucket:\n\n```zsh\naws s3api create-bucket \\\n    --bucket ${BUCKET_NAME} \\\n    --region us-east-1\n```\n\nSe recomienda activar el versionado del bucket por si se tiene que revertir algún cambio:\n\n```zsh\naws s3api put-bucket-versioning \\\n    --bucket ${BUCKET_NAME}  \\\n    --versioning-configuration Status=Enabled\n```\n\n### Declarative cluster\nComo amante de la IaC y GitOps, vamos a realizar el despliegue de forma declarativa. \n\nEn primer lugar, voy a usar una variable para el nombre del cluster:\n\n```zsh\nNAME=k8s.dbgjerez.es\n```\n\nAhora la definción del cluster la podemos generar con el siguiente comando: \n\n```zsh\nkops create cluster ${NAME} \\                   \n    --zones=eu-west-3b \\\n    --discovery-store=s3://${BUCKET_NAME}/${NAME}/discovery \\\n    --dry-run \\\n    -o yaml \u003e $NAME.yaml\n```\n\nEl fichero ```k8s.dbgjerez.es.yaml``` contrendrá la definición de nuestro cluster. El CRD ```Cluster``` para la defición del cluster y dos CRD  ```InstanceGroup```, uno para los maestros y otros para los workers.\n\nEn mi caso voy a modificar el tipo de instancia ec2. Al ser un cluster de desarrollo asumiré el riesgo de utilizar instancias de tipo stop. \n\n```yaml\nmachineType: t2.small\nmaxPrice: \"0.008\"\nmaxSize: 1\nminSize: 1\n```\n\nCon esta configuración, el precio total del cluster durante un mes sería en torno a 10€ a fecha de hoy.\n\nAdemás de los cambios realizados a nivel de instancias, voy a realizar modificaciones en la definición del cluster para activas los add-ons ```metrics-server``` y ```certManager```. \n\n```yaml\ncertManager:\n    enabled: true\nmetricsServer:\n    enabled: true\n    insecure: false\n```\n\nEn este punto, tenemos la definición deseada. Ahora solo nos queda aplicarla. \n\n### Deploy\n\nEl siguiente paso será desplegar nuestro cluster definitivamente. Para ello bastará con aplicar los ficheros: \n\n```zsh\n❯ kops create -f k8s.dbgjerez.es.yaml\n\nCreated cluster/k8s.dbgjerez.es\nCreated instancegroup/master-eu-west-3b\nCreated instancegroup/nodes-eu-west-3b\n\nTo deploy these resources, run: kops update cluster --name k8s.dbgjerez.es --yes\n```\n\nUna vez aplicado los CRDs, creamos el cluster: \n\n```zsh\n❯ kops update cluster --name ${NAME} --yes\nI0328 15:05:12.590601   99167 executor.go:111] Tasks: 0 done / 97 total; 49 can run\n```\n\nEsperamos unos minutos, dependiendo la potencia de las máquinas seleccionadas y hacemos login sobre el cluster:\n\n```zsh\n❯ kops export kubecfg --admin\nUsing cluster from kubectl context: k8s.dbgjerez.es\n\nkOps has set your kubectl context to k8s.dbgjerez.es\n```\n\nUna vez logueados, ya podemos hacer uso del cli de Kubernetes ```kubectl```.\n\n### Check\n\nVemos los nodos creados: \n```zsh\n❯ kubectl get nodes\nNAME                                          STATUS     ROLES                              AGE   VERSION\nip-172-20-35-30.eu-west-3.compute.internal    NotReady   node,spot-worker                   24s   v1.23.5\nip-172-20-57-255.eu-west-3.compute.internal   Ready      control-plane,master,spot-worker   97s   v1.23.5\n```\n\nChequeamos uso de CPU y memoria:\n```zsh\n❯ kubectl top nodes\nNAME                                          CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   \nip-172-20-39-66.eu-west-3.compute.internal    63m          6%     1003Mi          53%       \nip-172-20-41-136.eu-west-3.compute.internal   120m         12%    1375Mi          73%       \n```\n\n### Update the configuration\nGracias a la configuración declarativa de nuestro cluster, cualquier modificación sobre el mismo se simplifica. Concretamente solo necesitamos modificar el CRD correspondiente y aplicar los cambios: \n\n```zsh\nkops replace -f $NAME.yaml\nkops update cluster $NAME --yes\nkops rolling-update cluster $NAME --yes\n```\n\n## Documentación\n* [Blog](https://blog.dbgjerez.es/posts/kops-aws/)\n* [Kops getting started](https://kops.sigs.k8s.io/getting_started/aws/)\n* [Customizing manifests](https://kops.sigs.k8s.io/manifests_and_customizing_via_api/#using-a-manifest-to-manage-kops-clusters)\n* [Instance groups](https://kops.sigs.k8s.io/tutorial/working-with-instancegroups/#converting-an-instance-group-to-use-spot-instances)\n* [Addons](https://kops.sigs.k8s.io/addons/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdbgjerez%2Fkops-aws","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdbgjerez%2Fkops-aws","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdbgjerez%2Fkops-aws/lists"}