Basically part and parcel from https://docs.ansible.com/ansible/latest/user_guide/sample_setup.html ``` production # inventory file for production servers staging # inventory file for staging environment group_vars/ group1.yml # here we assign variables to particular groups group2.yml host_vars/ hostname1.yml # here we assign variables to particular systems hostname2.yml library/ # if any custom modules, put them here (optional) module_utils/ # if any custom module_utils to support modules, put them here (optional) filter_plugins/ # if any custom filter plugins, put them here (optional) site.yml # master playbook webservers.yml # playbook for webserver tier dbservers.yml # playbook for dbserver tier tasks/ # task files included from playbooks webservers-extra.yml # <-- avoids confusing playbook with task files roles/ common/ # this hierarchy represents a "role" tasks/ # main.yml # <-- tasks file can include smaller files if warranted handlers/ # main.yml # <-- handlers file templates/ # <-- files for use with the template resource ntp.conf.j2 # <------- templates end in .j2 files/ # bar.txt # <-- files for use with the copy resource foo.sh # <-- script files for use with the script resource vars/ # main.yml # <-- variables associated with this role defaults/ # main.yml # <-- default lower priority variables for this role meta/ # main.yml # <-- role dependencies library/ # roles can also include custom modules module_utils/ # roles can also include custom module_utils lookup_plugins/ # or other types of plugins, like lookup in this case webtier/ # same kind of structure as "common" was above, done for the webtier role monitoring/ # "" fooapp/ # "" ``` ## Bootstrapping 1. Check out this repository 1. Create a file `~/.ansible_vault` with the vault password 1. Use raspberry pi imager to install Ubuntu LTS (20.04 at time of this writing) 64-bit. 1. Find IP (via DHCP lease, reservation, or console?). 1. Login with username ubuntu, password ubuntu. Set a new password. 1. Add hostname to inventory. 1. Run `ssh-copy-id ubuntu@hostname` and enter your password. 1. Install galaxy modules with `ansible-galaxy install -r requirements.yml` 1. Run the `initial_user.yml` task: ``` ansible-playbook -u ubuntu tasks/initial_users.yml --limit=k8s3 ``` ## Bootstrapping the Cluster Start with the first control node: ``` ansible-playbook microk8s.yml --limit=k8s1 --extra-vars="skip_git=True" # Leave off skip_git if github is up ``` It will pause at the bootstrap step, but you can go ahead and hit enter. TODO: Automate this After the playbook completes and you've received the notification to bootstrap, do the following: ``` k8s1: sudo kubeadm init --pod-network-cidr 10.244.0.0/16 --control-plane-endpoint k8s.home.monkeybox.org --upload-certs --apiserver-advertise-address 10.42.42.201 local: ansible-vault edit ~/monkeybox_kubernetes/Ansible/bootstrap_output.txt # record output local: ansible-vault edit ~/monkeybox_kubernetes/Ansible/group_vars/k8s/vault # record values from output k8s1: cat /etc/kubernetes/admin.conf local: ansible-vault edit ~/monkeybox_kubernetes/Ansible/roles/k8s/files/config # record the config k8s1: mkdir -p $HOME/.kube k8s1: sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config k8s1: sudo chown $(id -u):$(id -g) $HOME/.kube/config k8s1: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` Rerun the playbook: ``` ansible-playbook microk8s.yml --limit=k8s1 --extra-vars="skip_git=True" # Leave off skip_git if github is up ``` From here, you may proceed to "other nodes" or "deploying workloads" ## MetallB local: ``` scp -r ~/monkeybox_kubernetes k8s1: ``` On k8s1: ``` kubectl edit configmap -n kube-system kube-proxy # search for `ipvs`, and set `strictARP` to true. See note [1] cd monkeybox_kubernetes/Workloads/metallb/ kubectl apply -f 001* kubectl apply -f 002* kubectl apply -f 003* kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)" kubectl get pods -n metallb-system ``` note [1]: They helpfully give the following shell code to help with automation. ``` kubectl get configmap kube-proxy -n kube-system -o yaml | \ sed -e "s/strictARP: false/strictARP: true/" | \ kubectl apply -f - -n kube-system ``` ## nfs-provisioning On k8s1: ``` cd ~/monkeybox_kubernetes/Workloads/nfs-provisioning kubectl apply -f 001* kubectl apply -f 002* kubectl apply -f 003* ``` ## ingress-nginx ``` cd ~/monkeybox_kubernetes/Workloads/ingress-nginx htpasswd -c auth fdamstra kubectl create secret generic basic-auth --from-file=auth kubectl apply -f ingress-nginx-controller-v0.45.0.yaml ``` ## cert-manager 1. log into the aws console 2. iam->users->`letsencrypt-wildcard`->security credentials 3. 'create access key' 4. Copy the secret into a file called `password.txt` in `~/monkeybox_kubernetes/Workloads/cert-manager` 5. Copy teh access key id into `~/monkeybox_kubernetes/Workloads/cert-manager/wildcard*` ``` cd ~/monkeybox_kubernetes/Workloads/cert-manager kubectl create secret generic aws-route53-creds --from-file=password.txt -n default kubectl apply -f cert-manager.yaml # big pause here kubectl apply -f staging_issuer.yaml kubectl apply -f prod_issuer.yaml kubectl apply -f wildcard_staging_issuer.yaml kubectl apply -f wildcard_prod_issuer.yaml ``` ## Other Nodes Adding other nodes should be straightforward: 1. Login with username ubuntu, password ubuntu. Set a new password. 1. Add hostname to inventory. 1. Run `ssh-copy-id ubuntu@hostname` and enter your password. 1. Run the `initial_user.yml` task ``` ansible-playbook -u ubuntu tasks/initial_users.yml --limit=k8s3 ``` 1. Run the full playbook (may as well run on everything) ``` ansible-playbook site.yml ``` ## Other workloasd You just kinda work throught he You just kinda work through them. sudo kubeadm join 10.42.42.201:6443 --token x01udi.u7clxsm3004sne9p \ --discovery-token-ca-cert-hash sha256:093b597fbd39eca8fdc0298339f1403792e4b06d50fabc9fdc226606e40197b9 \ --control-plane --certificate-key 0f98113e1146805b2783e696f2df3f6760a12a223a393517036cc94b452406b1 \ --apiserver-advertise-address IPHERE etcd manifest original values: ``` livenessProbe: initialDelaySeconds: 30 periodSeconds: 30 timeoutSeconds: 60 startupProbe: initialDelaySeconds: 30 periodSeconds: 30 timeoutSeconds: 60 ``` apiserver manifest original values: ``` initialDelaySeconds: 30 periodSeconds: 30 timeoutSeconds: 60 name: kube-apiserver readinessProbe: periodSeconds: 3 timeoutSeconds: 45