diff --git a/posts/2021-06-13_servers_Hardkernel Odroid Kubernetes Cluster.md b/posts/2021-06-13_servers_Hardkernel Odroid Kubernetes Cluster.md index 1267d7c..1c0eb28 100644 --- a/posts/2021-06-13_servers_Hardkernel Odroid Kubernetes Cluster.md +++ b/posts/2021-06-13_servers_Hardkernel Odroid Kubernetes Cluster.md @@ -1,4 +1,5 @@ # Odroid Cluster + ## WIP Say hello to my little odroid kubernetes cluster project. @@ -11,3 +12,16 @@ I followed [this](https://www.digitalocean.com/community/tutorials/how-to-create ![My odroid MC1 and N2 cluster](https://gitlab.inkletblot.com/inkletblot/simple-blog-api/-/raw/master/assets/odroid-cluster-2.jpg) +-ink + +# Update Mid 2021 + +I decided to totally rebuild this having never been able to get Rancher set up on it. See the details of that [here](https://www.inkletblot.com/projects/k3s-on-odroid-mc1s-a-guide) + +-ink + +# Update 2021-12-21 + +I have sadly now decomissioned this little cluster. The five MC1 units are currently unused and the N2 is now my media PC in my bedroom. Not all is sad though, I decomissiod it because I replaced it with a bigger and better setup using old HP t620 thin clients, of which I got 5 for a rediculously good price at a local IT liquidation auction. See more [here](https://www.inkletblot.com/projects/an-old-new-upgrade-to-kube) + +-ink diff --git a/posts/2021-07-28_work-related_Icons SVGs Fonts and Icomoon.md b/posts/2021-07-28_work-related_Icons SVGs Fonts and Icomoon.md index 751af3c..4efea6c 100644 --- a/posts/2021-07-28_work-related_Icons SVGs Fonts and Icomoon.md +++ b/posts/2021-07-28_work-related_Icons SVGs Fonts and Icomoon.md @@ -1,27 +1,74 @@ # Icomoon for Icon Managament + ## Icons, SVGs, Fonts, and Icomoon. -Cover background, note that at work we are using fluent Icons and the supplied font file is 2mb which is rediculous. +Early in the year I, for a project at work, was tasked with coming up with a solution to deal with icons. We had decided to use FluentUI icons from microsoft, but the 2Mb font file that they provide was a bit much to include in the app. So a solution was required. We wanted our solution to be easily versioned and source controlled. -I was tasked with finding a solution, we had started using prime icons as we are using primeng for the project. - -This lead me to looking at how primetek handle their icons. +After some time looking at different methods of processing font files to either parse out unwanted fonts or transpose wanted ones to a new file I realised that it was a pointless endeavour and I called it quits. At least from what I saw, fonts suck and I don't want anything to do with them. After some time feeling sorry for myself for a bit I decided to have a look at how primetek deal with their icons prime-icons, which we had considered for use but then abandoned. > an ironic note is that I end at the solution primetek use - as far as I can see - but not right away. -I noticed the use of some clever CSS font work, creating a tag and prepending it with a specific character of a font, which just happens to be an icon. +### A potential solution -``` -insert details here about how the solution works in short +I noticed the use of some clever CSS/font work, creating a tag and prepending it with a specific character of a font, which just happens to be an icon. + +The basics of the solution are below. + +```scss +@charset "UTF-8"; +@font-face { + font-family: "icomoon"; + src: url("fonts/icomoon.eot?36cs2a"); + src: url("fonts/icomoon.eot?36cs2a#iefix") format("embedded-opentype"), url("fonts/icomoon.ttf?36cs2a") + format("truetype"), url("fonts/icomoon.woff?36cs2a") format("woff"), + url("fonts/icomoon.svg?36cs2a#icomoon") format("svg"); + font-weight: normal; + font-style: normal; + font-display: block; +} +[class^="my-icons-"], +[class*=" my-icons-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: "icomoon" !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.my-icons-icon-1:before { + content: ""; +} + +.my-icons-icon-2:before { + content: ""; +} ``` -This lead me to looking at solutions for converting a collection of SVGs to a singular font file. Microsoft provides SVG copies of all of the fluent icons on github. Turns out this is not an easy task to do without a large amount of work. Originally we had wanted an in house solution to complete this conversion. But alas. +Then to insert the icon where it is wanted one can simply do the following -Realising that completing the conversion (on a short timescale without a lot of work), I started looking at online solutions and came across Icomoon. This was after quite some searching. I had not seen any suggestion of using such a site anywhere. +```html + +``` -Upon uploading some test icons and downloading the font file I realised that I had stumbled upon the very same solution that primetek was using for prime-icons, give or take some small changes that they have made to make things better for their users. +And the icon specified as content in the scss above will sit in the place of the `` tag. -And as such, I had found our solution. +### Icomoon + +This lead me to looking at solutions for converting a collection of SVGs to a singular font file. Microsoft provides SVG copies of all of the fluent icons on github so we had easy access to all the icons we wanted in that format. Turns out this is not an easy task to do without a large amount of work. Originally we had wanted an in house solution to complete this conversion. But alas. + +Realising that completing the conversion (on a short timescale without a lot of work) was totally unrealistic, I started looking at online solutions and came across Icomoon. This was after quite some searching throughout which I never heard it mentioned. I'm not sure which search term found it but I know that it was a direct search that did and not an article or forum post that lead me to it. + +Upon uploading some test icons and downloading the font file I realised that I had stumbled upon the very same solution that primetek was using for prime-icons, give or take some small changes that they have made to make things better/easier for their users. + +### The end + +And with that, I had found our solution. Icomoon is really a magical black box but what it produces is brilliant. @@ -29,3 +76,6 @@ Icomoon is really a magical black box but what it produces is brilliant. detail in long how solution works ``` +Source controlling the processed files and building the font and css into an npm package that we store in a private registry worked great and we have been using the same solution since, approx. 8 months I think. If ever you need a simple way of producing your own set of easily usable icons for a project, I suggest Icomoon. + +-ink. diff --git a/posts/2021-08-09_servers_K3s on Odroid MC1s, a Guide.md b/posts/2021-08-09_servers_K3s on Odroid MC1s, a Guide.md new file mode 100644 index 0000000..b6136eb --- /dev/null +++ b/posts/2021-08-09_servers_K3s on Odroid MC1s, a Guide.md @@ -0,0 +1,225 @@ +# DISCLAIMER + +This is not really a guide, it's essentially my notes from when I set up k3s on my Odroid MC1 cluster. + +# Setting up an Odroid MC1/N2 K3S cluster + +I initially saw a video by NetworkChuck about setting up a Raspberry Pi k3s cluster, see his blog post [here](https://learn.networkchuck.com/courses/take/ad-free-youtube-videos/lessons/26093614-i-built-a-raspberry-pi-super-computer-ft-kubernetes-k3s-cluster-w-rancher). I first went and tried to set up k3s on [my Odroid cluster](https://www.inkletblot.com/hardkernel-odroid-kubernetes-cluster) using his method, however as noted at the bottom of this post, I had some issues with it. So, after some time trying to fix the issues that were preventing me from getting his method working, I went looking for another option. + +## My personal notes + +I have included these just in case they lead someone else in the right direction in the future. + +> It seems networkchuck's setup does not work for me on my odroids, it gets installed but is failing consistently for some reason. +> I will try with this/these soon: +> [option 1](https://medium.com/@amadmalik/installing-kubernetes-on-raspberry-pi-k3s-and-docker-on-ubuntu-20-04-ef51e5e56), +> [option 2](https://computingforgeeks.com/install-kubernetes-on-ubuntu-using-k3s/) + +> It seems that this is my issue: [Kubernetes CGROUP PIDS](https://forum.odroid.com/viewtopic.php?p=321432&sid=cfa9f65dab7eaa4a56c67b0bafe6ff60#p321432) + +## The Docker Method + +### Initial Setup + +Firstly, set up master and worker hosts. + +My set up is odroid n2 as master with ip address 180 +and then 5 odroid mc1s as workers with ips 181-5 + +Both network and hostname can be setup by mounting rootfs and manually editing/adding the required files + +Example netplan '10-config.yaml': + +```yaml +network: + version: 2 + renderer: networkd + ethernets: + eth0: + addresses: [192.168.0.XXX/16] + gateway4: 192.168.0.1 + nameservers: + addresses: [192.168.0.1, 1.1.1.1] + search: [mydomain] +``` + +Also set timezone if you want. + +```bash +sudo timedatectl set-timezone Australia/Adelaide +``` + +In my case the following was used: + +1. flash image to micro sdcard +2. mount micro sdcard rootfs partition: + `mount /dev/mmkblk... /mnt/tmp` +3. edit `/etc/hostname` and add the netplan config above to `/etc/netplan` +4. unmount `/mnt/tmp` +5. stick sdcard in odroid SBC and power on. + +### Kernel Patch for MC1s + +We must rebuild kernel with updated options so that cgroup_pids is enabled. Hardkernel has a guide [here](https://wiki.odroid.com/odroid-xu4/os_images/linux/ubuntu_5.4/ubuntu_5.4/kernel_build_guide) for rebuilding, only two edits are required after the `make odroidxu4_defconfig` step, they are covered [here](https://forum.odroid.com/viewtopic.php?p=321432&sid=cfa9f65dab7eaa4a56c67b0bafe6ff60#p321432) + +note that the following tools are required for the build: bison, flex, libssl-dev, and bc + +```bash +apt install bison flex libssl-dev bc -y +``` + +### The K3S install + +Run the following on all nodes: + +```bash +iptables -F \ +&& update-alternatives --set iptables /usr/sbin/iptables-legacy \ +&& update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy \ +&& reboot + +apt update; apt upgrade -y; apt autoremove -y; apt clean; apt install docker.io curl -y +reboot + +systemctl start docker +systemctl enable docker + +systemctl status docker + +# Be sure that the firewall is disabled for ease +ufw disable +``` + +Then run the following only on the master node: + +```bash +# for master +curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" sh -s - --docker + +# check its running +systemctl status k3s +kubectl get nodes + +# Get token from master, make sure to store it somewhere +cat /var/lib/rancher/k3s/server/node-token +``` + +Then run the following on the worker nodes, updating the command for each: + +```bash +# for workers +# Fill this out ... +curl -sfL http://get.k3s.io | K3S_URL=https://:6443 K3S_TOKEN= K3S_NODE_NAME="odroid-mc1-X" sh -s - --docker + +systemctl status k3s-agent +``` + +And thus you should be done, check the master node to see: + +```bash +# Check node was added on master +kubectl get nodes +``` + +And all should be up and running correctly, it was for me at least. + +I have kept the following notes attached here for posterity, really they came first in this effort - chronologically - but given I stopped at random near the end I felt it better to lead with the successful solution. + +-ink + +--- + +## Networkchuck + +This did not initially work for me and I gave up on it, I think the issue was actually the cgroup_pids thing covered above but once I got my second attempt working I didn't want to come back to this. + +Once these have been set up with ip addresses and hostnames (odroid-n2, odroid-mc1-1(to 5)), you will want to set up ssh access to each machine, I have a couple of ansible playbooks that I use for this. + +Either the following to set up users and access: + +```yml +- hosts: all + become: yes + tasks: + - name: create the 'kuber' user + user: name=kuber append=yes state=present createhome=yes bash=/bin/bash + + - name: allow 'kuber' to have passwordless sudo + lineinfile: + dest: /etc/sudoers + line: "kuber ALL=(ALL) NOPASSWD: ALL" + validate: "visudo -cf %s" + + - name: set up authorised keys for the 'kuber' user + authorized_key: user=kuber key="{{item}}" + with_file: + - ~/.ssh/id_rsa.pub +``` + +Or if you already set up users: + +```yml +- hosts: all + become: yes + tasks: + - name: set up authorised keys for the 'root' user + authorized_key: user=root key="{{item}}" + with_file: + - ~/.ssh/id_rsa.pub +``` + +The above can be used with a hosts file such as the following + +``` +[masters] +master ansible_host=192.168.0.XXX ansible_user= ansible_ssh_pass= + +[workers] +worker1 ansible_host=192.168.0.XXX ansible_user= ansible_ssh_pass= +worker2... +... + +[all:vars] +ansible_python_interpreter=/usr/bin/python3 +``` + +Then the following commands: + +```bash +sudo iptables -F \ +&& sudo update-alternatives --set iptables /usr/sbin/iptables-legacy \ +&& sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy \ +&& sudo reboot +``` + +useful command formatted from step 2.2.1 of reference material [here](https://learn.networkchuck.com/courses/take/ad-free-youtube-videos/lessons/26093614-i-built-a-raspberry-pi-super-computer-ft-kubernetes-k3s-cluster-w-rancher) + +Then the following on the master node: + +```bash +curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" sh -s - +``` + +Then on the master node grab its node token + +```bash +sudo cat /var/lib/rancher/k3s/server/node-token +``` + +Then run the following on each of the workers: +(note in my case curl was not installed) + +[your server] = master node ip + +YOURTOKEN = token from above + +servername = unique name for node (I use hostname) + +```bash +curl -sfL https://get.k3s.io | K3S_TOKEN="YOURTOKEN" K3S_URL="https://[your server]:6443" K3S_NODE_NAME="servername" sh -z + +# I used +apt install curl -y && curl -sfL https://get.k3s.io | K3S_TOKEN="YOURTOKEN" K3S_URL="https://[your server]:6443" K3S_NODE_NAME="servername" sh -z +``` + +Sadly this is where my notes ended as, although the install worked, all of the system pods were failing and thus I moved on to the method listed above. diff --git a/posts/2021-12-21_servers_An Old New Upgrade to Kube.md b/posts/2021-12-21_servers_An Old New Upgrade to Kube.md new file mode 100644 index 0000000..ed59993 --- /dev/null +++ b/posts/2021-12-21_servers_An Old New Upgrade to Kube.md @@ -0,0 +1 @@ +To be completed xx