<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<title>My Blog</title>
	<subtitle>My blog site.</subtitle>
	<link href="https://petejohanson.dev/blog/feed.xml" rel="self" type="application/atom+xml"/>
    <link href="https://petejohanson.dev/blog/"/>
	<updated>2022-06-15T00:00:00+00:00</updated>
	<id>https://petejohanson.dev/blog/feed.xml</id>
	<entry xml:lang="en">
		<title>A New Journey</title>
		<published>2022-06-15T00:00:00+00:00</published>
		<updated>2022-06-15T00:00:00+00:00</updated>
		<link href="https://petejohanson.dev/blog/new-journey-2022/" type="text/html"/>
		<id>https://petejohanson.dev/blog/new-journey-2022/</id>
		<content type="html">&lt;p&gt;For the past year or so, my wife and I have slowly been piecing together a plan to upend our lives (in a good way!) and commit to some radical changes.
We&#x27;ve already been homeschooling our two children, and with our older child eligible for free national park admission for the next year, we&#x27;ve decided to
take our family on the road, and try road schooling, starting this fall (2022).&lt;&#x2F;p&gt;
&lt;p&gt;This has some immediate side effects!&lt;&#x2F;p&gt;
&lt;h1 id=&quot;home&quot;&gt;Home?&lt;&#x2F;h1&gt;
&lt;p&gt;We&#x27;ve sold our home! Our &lt;em&gt;new&lt;&#x2F;em&gt; home is going to be a &amp;quot;rig&amp;quot;, composed of a pick-up truck and an RV trailer, which we will be living in full time for the foreseeable future! We&#x27;re ironing out the details, and I&#x27;ll post more pics when I can.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;job&quot;&gt;Job?&lt;&#x2F;h1&gt;
&lt;p&gt;Part of the planning has been the recognition that my current position as Director of Software Engineering at &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;crossoverhealth.com&quot;&gt;Crossover Health&lt;&#x2F;a&gt; is not one that would fit well with our travel lifestyle. In particular, we&#x27;ll be traveling often mid-week, I&#x27;ll be helping with home schooling more, etc. Trying to maintain my current role would be incredibly stressful, and I would not feel like I was doing my best work, and that would really hurt my need for integrity.&lt;&#x2F;p&gt;
&lt;p&gt;As such, I&#x27;ve had to do the right, but sad, thing, which was to give notice to my amazing boss, Ben, and the rest of my team, that I&#x27;ll be stepping away from the Crossover family at the end of July.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve had an amazing time building out the engineering team the past 5+ years, from me and two other engineers, to a team over 35+ folks, all of which I&#x27;ve been incredibly grateful to have had an opportunity to work with. I will miss them all, and am looking forward to staying in touch.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;zmk&quot;&gt;ZMK&lt;&#x2F;h1&gt;
&lt;p&gt;The other huge change, is that as the door closes on my time at Crossover, a new door opens for me to have time to focus on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;zmk.dev&#x2F;&quot;&gt;ZMK&lt;&#x2F;a&gt; and keyboard design while we travel! Instead of trying to take on part time or contract work doing healthcare software, or other backend API work as I might have in the past, my intention is to devote that time to ZMK.&lt;&#x2F;p&gt;
&lt;p&gt;I am &lt;em&gt;really&lt;&#x2F;em&gt; excited for this. Full stop.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;so-much-to-do&quot;&gt;So Much To Do&lt;&#x2F;h2&gt;
&lt;p&gt;So far, in the 2+ years working on ZMK, we&#x27;ve done a &lt;em&gt;lot&lt;&#x2F;em&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;zmk.dev&#x2F;blog&#x2F;2020&#x2F;08&#x2F;12&#x2F;zmk-sotf-1&quot;&gt;Initial work&lt;&#x2F;a&gt; to create the core keymap infrastructure, basic encoders, user config repos, and basic mod-taps&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;zmk.dev&#x2F;blog&#x2F;2020&#x2F;09&#x2F;21&#x2F;zmk-sotf-2&quot;&gt;Adoption and evolution&lt;&#x2F;a&gt; got us to a usable system, with BLE profiles, generic hold-taps.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;zmk.dev&#x2F;blog&#x2F;2020&#x2F;11&#x2F;09&#x2F;zmk-sotf-3&quot;&gt;Keymap&#x2F;HID refinements, Implicit Modifiers, Power Management&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;zmk.dev&#x2F;blog&#x2F;2021&#x2F;01&#x2F;27&#x2F;zmk-sotf-4&quot;&gt;Combos, Sticky Keys, Initial Display Support, Misc. Fixes&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;zmk.dev&#x2F;blog&#x2F;2022&#x2F;04&#x2F;10&#x2F;zmk-sotf-5&quot;&gt;Caps Word, Macros, Tap Dance, Split Locality for RGB&#x2F;Power Control&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;My goal is to be able to build upon the amazing core we have so far and keep going! Some things already have work&#x2F;PRs I want to review and merge, others need me to stay heads and down and add code:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Encoders&#x2F;sensors for split peripherals&lt;&#x2F;li&gt;
&lt;li&gt;Fix the few lingering display issues to make them officially supported&lt;&#x2F;li&gt;
&lt;li&gt;More powerful power management, including for connected peripheral hardware&lt;&#x2F;li&gt;
&lt;li&gt;Simpler BLE profile management&lt;&#x2F;li&gt;
&lt;li&gt;Multiple peripheral support (dongle mode!)&lt;&#x2F;li&gt;
&lt;li&gt;RGB animations, and per-key RGB&lt;&#x2F;li&gt;
&lt;li&gt;ZMK Studio, to make runtime keymaps a thing!&lt;&#x2F;li&gt;
&lt;li&gt;Consistent PR review of contributions from others (our PR backlog is painful right now)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In order to achieve this focus, I will be working towards trying to be financially supported by my work on ZMK. This is a &lt;em&gt;huge&lt;&#x2F;em&gt; change.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;aside-open-source-sustainability&quot;&gt;Aside: Open Source Sustainability&lt;&#x2F;h2&gt;
&lt;p&gt;In the wake of the log4j vulnerabilities, there was a &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;thenewstack.io&#x2F;log4j-is-one-big-i-told-you-so-for-open-source-communities&#x2F;&quot;&gt;renewed&lt;&#x2F;a&gt; &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;gettotext.com&#x2F;according-to-log4j-why-open-source-projects-have-to-be-sustainable&#x2F;&quot;&gt;focus&lt;&#x2F;a&gt; on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;blog.scottlogic.com&#x2F;2021&#x2F;12&#x2F;20&#x2F;open-source-sustainability.html&quot;&gt;open source sustainability&lt;&#x2F;a&gt;. This is &lt;em&gt;not&lt;&#x2F;em&gt; a new issue, but one that is getting more attention only thanks to an unfortunate set of reported security vulnerabilities.&lt;&#x2F;p&gt;
&lt;p&gt;I am a firm believer in open source, but my experience with open source and money are less than stellar. My previous employment at an &amp;quot;open source company&amp;quot; was mixed: the company itself is still going, but the &#x27;open source&#x27; part of that was a dud.&lt;&#x2F;p&gt;
&lt;p&gt;There are a lot of different &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Business_models_for_open-source_software&quot;&gt;business models&lt;&#x2F;a&gt; for open source work. For something like ZMK, which does &lt;em&gt;not&lt;&#x2F;em&gt; have a &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;licenses&#x2F;copyleft.en.html&quot;&gt;copyleft&lt;&#x2F;a&gt; license, the options up for consideration really break down in to two major categories:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;non-oss-work-funds-oss-work&quot;&gt;Non-OSS Work Funds OSS Work&lt;&#x2F;h3&gt;
&lt;p&gt;Some example models that fit this:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Sell commercial support&#x2F;consulting&#x2F;services based on the OSS project.&lt;&#x2F;li&gt;
&lt;li&gt;Commercial product built on open source core.&lt;&#x2F;li&gt;
&lt;li&gt;&amp;quot;Freemium&amp;quot; model where additional features are made available for a price.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;directly-funding-oss-work&quot;&gt;Directly Funding OSS Work&lt;&#x2F;h3&gt;
&lt;p&gt;This includes approaches like:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Direct sponsorship&#x2F;patronage by users&#x2F;companies.&lt;&#x2F;li&gt;
&lt;li&gt;Bounties on bugs&#x2F;features&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;getting-paid-to-do-what-i-love&quot;&gt;Getting Paid To Do What I Love?&lt;&#x2F;h2&gt;
&lt;p&gt;As I imagined how I might want to approach this, a set of priorities stuck out:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;I desperately want not to break the trust that I have earned with the community, who so far have relied on ZMK not having financial interests influencing it (or me, given my role as the creator and lead)&lt;&#x2F;li&gt;
&lt;li&gt;I want the time spent on ZMK to broadly benefit the project and the community as a whole, not one particular user or company leveraging ZMK.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Put another way:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Transparency in the process, direction, and funding is key,&lt;&#x2F;li&gt;
&lt;li&gt;Money can mean influence; what I focus on, where I spend my time, etc.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;From those funding options I discussed above, this is what I&#x27;ve settled on:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Direct sponsorship&#x2F;patronage, with no constraints on what I spend my time on.&lt;&#x2F;li&gt;
&lt;li&gt;A selection of services I offer for a fee, i.e. contract work, which can be split into sub-categories:
&lt;ul&gt;
&lt;li&gt;Paid work on specific open source features&lt;&#x2F;li&gt;
&lt;li&gt;Paid work on new open source drivers&lt;&#x2F;li&gt;
&lt;li&gt;Paid work on &amp;quot;board bring up&amp;quot; for open source keyboards&lt;&#x2F;li&gt;
&lt;li&gt;Paid work on &amp;quot;board bring up&amp;quot; for commercial&#x2F;closed source keyboards&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I am &lt;em&gt;NOT&lt;&#x2F;em&gt; going to:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Do a &amp;quot;freemium&amp;quot; model.&lt;&#x2F;li&gt;
&lt;li&gt;Build some commercial product on top of ZMK.&lt;&#x2F;li&gt;
&lt;li&gt;Do bounties on bugs&#x2F;features&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;direct-sponsorship-patronage&quot;&gt;Direct Sponsorship&#x2F;Patronage&lt;&#x2F;h3&gt;
&lt;p&gt;Ideally, the funds from this would be enough to support me and my family, and I can continue to generally contribute to the project, with as
broad an impact as I can make. I am also realistic: getting my sponsorship to these levels may take time, or perhaps never happen. But given
the &lt;em&gt;advantages&lt;&#x2F;em&gt; to sponsorship, I am going to keep working towards this as the end game.&lt;&#x2F;p&gt;
&lt;p&gt;To sponsor me, I&#x27;ve set up several sponsor tiers in GitHub Sponsors, named after various wireless standards:&lt;&#x2F;p&gt;
&lt;iframe src=&quot;https:&#x2F;&#x2F;github.com&#x2F;sponsors&#x2F;petejohanson&#x2F;card&quot; title=&quot;Sponsor petejohanson&quot; height=&quot;225&quot; width=&quot;600&quot; style=&quot;border: 0;&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;I&#x27;ve added some &amp;quot;perks&amp;quot; to those tiers, but none that are gate-keeping (you shouldn&#x27;t have to sponsor me to see my plans, or access me via Discord, etc. See my previous note about transparency).&lt;&#x2F;p&gt;
&lt;p&gt;I would &lt;em&gt;love&lt;&#x2F;em&gt; to see companies that are leveraging ZMK recognize the value in this kind of contribution to my efforts, but also understand
that might be harder for them to recognize the &lt;em&gt;value&lt;&#x2F;em&gt; in this kind of financial contribution. This might be especially difficult, given
they&#x27;ve already been &amp;quot;getting my time for free&amp;quot; historically.&lt;&#x2F;p&gt;
&lt;p&gt;Given that, the second funding option will also be a part of the picture, at least as a gap measure:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;project-sponsorship-versus-personal&quot;&gt;Project Sponsorship Versus Personal&lt;&#x2F;h3&gt;
&lt;p&gt;As some of you may know, ZMK already has &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;opencollective.com&#x2F;ZMKFirmware&quot;&gt;sponsorship on Open Collective&lt;&#x2F;a&gt; for over a year. At no point have those funds
been used to pay any individuals for their time&#x2F;work on ZMK. Those funds are used for DNS name registration, other services, and most recently my work on
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;petejohanson&#x2F;zmk-uno&quot;&gt;ZMK Uno&lt;&#x2F;a&gt;, a development kit for ZMK.&lt;&#x2F;p&gt;
&lt;p&gt;ZMK project sponsorship isn&#x27;t going to go anywhere. We will continue to find new ways to use the funds, e.g. making ZMK stickers, possibly paying legal fees to trademark certain terms, etc. I would encourage individuals and companies who are financially able to do so to continue donating there.&lt;&#x2F;p&gt;
&lt;p&gt;My personal sponsorship is just that, funding the work I specifically do for the project. For those individuals or companies who recognize the specific value I add to the project, I appreciate your sponsorship for that work.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;contract-spec-work&quot;&gt;Contract&#x2F;Spec Work&lt;&#x2F;h3&gt;
&lt;p&gt;Getting paid for specific work done on ZMK, or for keyboard using ZMK, is an obvious additional revenue source. The main &lt;em&gt;downside&lt;&#x2F;em&gt; to this funding
source is the &amp;quot;influence&amp;quot; that such work plays on my time; every hour doing contract work for a specific user&#x2F;company is an hour &lt;em&gt;not&lt;&#x2F;em&gt; spent on
work of my choosing. There&#x27;s certainly a chance that the contract work &lt;em&gt;aligns&lt;&#x2F;em&gt; with what I would choose to work on anyways. Ideally, I will be able
to be selective with the contract work I take on, and favor work that aligns in this way.&lt;&#x2F;p&gt;
&lt;p&gt;To avoid any one company or contract having too much influence, there are a few mitigations I&#x27;m considering:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Spend a max percentage of my time any given month on a certain contract. 50%? 25%? Something to be evaluated.&lt;&#x2F;li&gt;
&lt;li&gt;Bake &amp;quot;open source work of my choosing&amp;quot; &lt;em&gt;into&lt;&#x2F;em&gt; my contracts. This might be in the form of adjusting my bill rate for contract work to be &amp;quot;doubled&amp;quot; to cover
time spent on other OSS work, or include hours baked into the contract that are for that OSS work.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;For now, to kick start this, I&#x27;ve created a selection of &amp;quot;one-time&amp;quot; options within GitHub Sponsorship for these, but you can also contact me directly
if you are interested in something else&#x2F;more specific.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-future&quot;&gt;The Future&lt;&#x2F;h1&gt;
&lt;p&gt;I&#x27;m incredibly excited for this journey. I&#x27;m so thankful my wife and family are embarking on it with me.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m also thankful for all of the users and companies who have chosen ZMK, trusted me and our community to power their keyboards, and contributed to ZMK.&lt;&#x2F;p&gt;
&lt;p&gt;I can&#x27;t wait to see what we can accomplish together in the future.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Cluster Triple - GitLab Runner</title>
		<published>2020-01-26T00:00:00+00:00</published>
		<updated>2020-01-26T00:00:00+00:00</updated>
		<link href="https://petejohanson.dev/blog/cluster-triple-gitlab-runner/" type="text/html"/>
		<id>https://petejohanson.dev/blog/cluster-triple-gitlab-runner/</id>
		<content type="html">&lt;p&gt;In my previous post, I outline the &lt;a href=&quot;https:&#x2F;&#x2F;petejohanson.dev&#x2F;blog&#x2F;cluster-triple-k3s-setup&#x2F;&quot;&gt;Kubernetes setup&lt;&#x2F;a&gt; steps. Next up, I&#x27;m going install GitLab Runner via the standard helm chart. Beware: This was much harder than I hoped it would be!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;goals&quot;&gt;Goals&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;Install GitLab Runner on the new Kubernetes Cluster running on the Cluster Triple + Base Pi.&lt;&#x2F;li&gt;
&lt;li&gt;Add a job to a GitLab project that will be executed by our private runner.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;gitlab-runner-registration-token&quot;&gt;GitLab Runner Registration Token&lt;&#x2F;h2&gt;
&lt;p&gt;In order to register a new GitLab Runner requires you use a registration token that is from either a certain GitLab project
or a GitLab group that you are an owner of. For a certain project or group, you you can navigate to &lt;strong&gt;Settings » CI&#x2F;CD&lt;&#x2F;strong&gt;
and expand the *&lt;em&gt;Runners&lt;&#x2F;em&gt; section. From there, make a note of the &lt;em&gt;registration token&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installing-the-helm-chart&quot;&gt;Installing the Helm Chart&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;installing-helm&quot;&gt;Installing Helm&lt;&#x2F;h3&gt;
&lt;p&gt;If you don&#x27;t already have Helm installed, check out the &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;helm&#x2F;helm#install&quot;&gt;installtion options&lt;&#x2F;a&gt; to
get the &lt;code&gt;helm&lt;&#x2F;code&gt; CLI installed. I used Helm V3, although this should work fine with Helm V2 as well.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gitlab-chart-repo&quot;&gt;GitLab Chart Repo&lt;&#x2F;h3&gt;
&lt;p&gt;GitLab&#x27;s helm charts can be found in their own Helm repository, so first we&#x27;ll need to add the repo to your local setup:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; helm repo add gitlab https:&#x2F;&#x2F;charts.gitlab.io&#x2F;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;gitlab&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; has been added to your repositories
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;helm-chart-values&quot;&gt;Helm Chart Values&lt;&#x2F;h3&gt;
&lt;p&gt;To install the GitLab helm chart, there are some required configuration values that need to be passed. The full &lt;code&gt;values.yaml&lt;&#x2F;code&gt;
file that worked for me was the following:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;image&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;petejohanson&#x2F;gitlab-runner:latest
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;gitlabUrl&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;gitlab.com&#x2F;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;runnerRegistrationToken&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;m-FbJnAoZLeEf_q_3akE&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;runners&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;tags&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;arm&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;runUntagged&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;false
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;helpers&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;image&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;gitlab&#x2F;gitlab-runner-helper:arm-latest
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;rbac&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;create&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Let&#x27;s break down those various values:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;image&lt;&#x2F;code&gt; - The default &lt;code&gt;gitlab-runner&lt;&#x2F;code&gt; Docker images is for &lt;code&gt;x86_64&lt;&#x2F;code&gt;, not using the manifest behaviour that allows multi-platform images. See the PS at the end of this article for how this image was created, if you don&#x27;t want to use the various I&#x27;ve built.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;gitlabUrl&lt;&#x2F;code&gt; - Since I&#x27;m registering this to the SAAS public GitLab instance, I&#x27;m using the normal GitLab URL.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;runnerRegistrationToken&lt;&#x2F;code&gt; - This is the registration token noted in the start of our process. This is a private&#x2F;secret value.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;runners.tags&lt;&#x2F;code&gt; - Because I only want certain special jobs picked up by this runner, I&#x27;ve added the &lt;code&gt;arm&lt;&#x2F;code&gt; tag to the runner.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;runners.runUntagged&lt;&#x2F;code&gt; - Same.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;runners.helpers.image&lt;&#x2F;code&gt; - This makes sure that the helper container that runs along-side the job containers using the version with the correct platform (&lt;em&gt;Note&lt;&#x2F;em&gt;: It would be nice if GitLab published images&#x2F;tags using a manifest that pointed to the different architecture images properly)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;rbac.create&lt;&#x2F;code&gt; - Create the custom cluster role as part of the chart, since the runner needs to make calls into the Kubernetes API.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;install-the-chart&quot;&gt;Install The Chart&lt;&#x2F;h3&gt;
&lt;p&gt;We&#x27;ll install the &lt;code&gt;gitlab-runner&lt;&#x2F;code&gt; helm chart into a separate namespace, named &lt;code&gt;gitlab-runner&lt;&#x2F;code&gt;, so we&#x27;ll install the helm chart
with the following:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; helm -n gitlab-runner install -f values.yaml gitlab-runner gitlab&#x2F;gitlab-runner
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once that completes, you can check on the status of the running by listing the pods in that new &lt;code&gt;gitlab-runner&lt;&#x2F;code&gt; namespace:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; kubectl get pods -n gitlab-runner
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;NAME&lt;&#x2F;span&gt;&lt;span&gt;                                                 READY   STATUS              RESTARTS   AGE
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;gitlab-runner-gitlab-runner-f7d9cb88b-bhxc5&lt;&#x2F;span&gt;&lt;span&gt;          1&#x2F;1     Running             0          6m13s
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once the runner has a status of &lt;code&gt;Running&lt;&#x2F;code&gt;, you can refresh the &lt;strong&gt;CI&#x2F;CD&lt;&#x2F;strong&gt; page in GitLab and see the runner registered, with a green icon to show it live&#x2F;active.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;running-a-job&quot;&gt;Running a Job&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;adding-a-tag-to-a-job&quot;&gt;Adding A Tag To A Job&lt;&#x2F;h3&gt;
&lt;p&gt;Since we registered our runner to &lt;em&gt;not&lt;&#x2F;em&gt; pick up untagged jobs, and added an &lt;code&gt;arm&lt;&#x2F;code&gt; tag to our runner, to get a job picked up by the runner we&#x27;ll need to add the same tag to a job in our project. The &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ee&#x2F;ci&#x2F;yaml&#x2F;README.html#tags&quot;&gt;&lt;code&gt;tags&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; setting for a job is an array of tags required to exist on the runner. Here&#x27;s an example job:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;build:rust:arm&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;stage&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;build
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;image&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;rust:1-slim
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;tags&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;    - &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;arm
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fbcbb;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color:#eceff4;&quot;&gt;:
&lt;&#x2F;span&gt;&lt;span&gt;    - &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;cargo build
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;em&gt;Note&lt;&#x2F;em&gt;: Your job must use an &lt;code&gt;image&lt;&#x2F;code&gt; that works on the ARM architecture. Most images in Docker Hub that are part of the &amp;quot;core library&amp;quot; are actually a manifest that points to different docker images for different architectures, so should work. Others, e.g. &lt;code&gt;rustlang&#x2F;nightly-slim&lt;&#x2F;code&gt; are &lt;em&gt;only&lt;&#x2F;em&gt; built for x86_64.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;running&quot;&gt;Running&lt;&#x2F;h3&gt;
&lt;p&gt;Once you push a commit with that job definition, you can monitor your cluster for a new pod starting to run the job:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; kubectl get pods -n gitlab-runner
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;NAME&lt;&#x2F;span&gt;&lt;span&gt;                                                 READY   STATUS              RESTARTS   AGE
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;gitlab-runner-gitlab-runner-f7d9cb88b-bhxc5&lt;&#x2F;span&gt;&lt;span&gt;          1&#x2F;1     Running             0          6m13s
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;runner-p1uajn7v-project-12786723-concurrent-09xbxs&lt;&#x2F;span&gt;&lt;span&gt;   0&#x2F;2     ContainerCreating   0          37s
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can see an &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;seize&#x2F;seize&#x2F;-&#x2F;jobs&#x2F;415072005&quot;&gt;example of a job&lt;&#x2F;a&gt; completed with the GitLab Runner on my Cluster Triple Kubernetes cluster.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;&#x2F;h2&gt;
&lt;p&gt;Once I got the custom &lt;code&gt;gitlab-runner&lt;&#x2F;code&gt; Docker image built, the final setup was &lt;em&gt;really&lt;&#x2F;em&gt; easy. With this configured, it should
be very easy to build binaries or even Docker images that target the ARM architecture as part of your standard CI&#x2F;CD pipeline.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;ps-building-the-gitlab-runner-docker-image&quot;&gt;PS - Building the &lt;code&gt;gitlab-runner&lt;&#x2F;code&gt; Docker image&lt;&#x2F;h4&gt;
&lt;p&gt;In order to make this work, I need to build the &lt;code&gt;gitlab-runner&lt;&#x2F;code&gt; Docker image, but for the &lt;code&gt;arm&lt;&#x2F;code&gt; architecture. To do this, I took the following steps:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Installed &lt;code&gt;qemu-system-arm&lt;&#x2F;code&gt; on my Linux laptop.&lt;&#x2F;li&gt;
&lt;li&gt;Used libvert&#x2F;GNOME Boxes to create a Fedora 30 VM running on the ARM architecture.&lt;&#x2F;li&gt;
&lt;li&gt;Logged into a shell in the new ARM based Fedora VM.&lt;&#x2F;li&gt;
&lt;li&gt;Installed various Fedora packages for Go, &lt;code&gt;buildah&lt;&#x2F;code&gt; to build Docker images, etc.&lt;&#x2F;li&gt;
&lt;li&gt;Checked out the &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;gitlab-org&#x2F;gitlab-runner&quot;&gt;&lt;code&gt;gitlab-runer&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Ran &lt;code&gt;make build_simple&lt;&#x2F;code&gt; to build &lt;code&gt;gitlab-runner&lt;&#x2F;code&gt; for ARM. This took a not inconsiderable amount of time.&lt;&#x2F;li&gt;
&lt;li&gt;Built &lt;code&gt;dumb-init&lt;&#x2F;code&gt; and &lt;code&gt;git-lfs&lt;&#x2F;code&gt; from their respective git repos, since banries for ARM weren&#x27;t handy.&lt;&#x2F;li&gt;
&lt;li&gt;Copied the binaries for &lt;code&gt;dumb-init&lt;&#x2F;code&gt;, &lt;code&gt;git-lfs&lt;&#x2F;code&gt;, and GitLab Runner from &lt;code&gt;out&#x2F;binaries&#x2F;gitlab-runer&lt;&#x2F;code&gt; into the &lt;code&gt;dockerfiles&#x2F;alpine&#x2F;&lt;&#x2F;code&gt; directory from the &lt;code&gt;gitlab-runner&lt;&#x2F;code&gt; repository.&lt;&#x2F;li&gt;
&lt;li&gt;Edit the &lt;code&gt;dockerfiles&#x2F;alpine&#x2F;Dockerfile&lt;&#x2F;code&gt; to not fetch various files over HTTP, but copy from the local filesystem.&lt;&#x2F;li&gt;
&lt;li&gt;Run &lt;code&gt;buildah bud --build-arg DOCKER_MACHINE_VERSION=0.16.2 -t petejohanson&#x2F;gitlab-runner:latest .&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Wait&lt;&#x2F;li&gt;
&lt;li&gt;Run &lt;code&gt;buildah login docker.io&lt;&#x2F;code&gt; to log in with my Docker Hub credentials.&lt;&#x2F;li&gt;
&lt;li&gt;Do &lt;code&gt;buildah push -D petejohanson&#x2F;gitlab-runner:latest&lt;&#x2F;code&gt; to push the images.&lt;&#x2F;li&gt;
&lt;li&gt;Whew!&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Cluster Triple - k3s setup</title>
		<published>2019-09-09T00:00:00+00:00</published>
		<updated>2019-09-09T00:00:00+00:00</updated>
		<link href="https://petejohanson.dev/blog/cluster-triple-k3s-setup/" type="text/html"/>
		<id>https://petejohanson.dev/blog/cluster-triple-k3s-setup/</id>
		<content type="html">&lt;p&gt;In my previous post, I did the &lt;a href=&quot;https:&#x2F;&#x2F;petejohanson.dev&#x2F;blog&#x2F;cluster-triple-initial-setup&#x2F;&quot;&gt;hardware setup&lt;&#x2F;a&gt;. Next up, I&#x27;m going to
get Kubernetes running!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;goals&quot;&gt;Goals&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;CBRIDGE&lt;&#x2F;code&gt; controller Pi as the Kubernetes master node&lt;&#x2F;li&gt;
&lt;li&gt;Join the three CM devices in the Cluster Triple as nodes in the cluster&lt;&#x2F;li&gt;
&lt;li&gt;Verify working behaviour of Kubernetes, with run of a simple command in a pod in the cluster&lt;&#x2F;li&gt;
&lt;li&gt;Access the cluster from my local laptop device.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;kubernetes-distribution&quot;&gt;Kubernetes Distribution&lt;&#x2F;h2&gt;
&lt;p&gt;This year, Rancher Labs released a new project, called &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;k3s.io&quot;&gt;k3s&lt;&#x2F;a&gt; which is a
lightweight, but still certified distribution of &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;kubernetes.io&#x2F;&quot;&gt;Kubernetes&lt;&#x2F;a&gt;,
that is tailored for IoT, ARM, CI, etc uses where stock Kubernetes isn&#x27;t as suitable.&lt;&#x2F;p&gt;
&lt;p&gt;I haven&#x27;t played with &lt;code&gt;k3s&lt;&#x2F;code&gt; yet, so this is a perfect opportunity to do so!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;control-node-install&quot;&gt;Control Node Install&lt;&#x2F;h2&gt;
&lt;p&gt;First, we&#x27;ll run the standard &lt;code&gt;k3s&lt;&#x2F;code&gt; install script on the controller Pi. This will get our
controller Pi set up as a Kubernetes master, and leave the CM devices as worker nodes eventually:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@cbridge$&lt;&#x2F;span&gt;&lt;span&gt; curl -sfL https:&#x2F;&#x2F;get.k3s.io &lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;sh&lt;&#x2F;span&gt;&lt;span&gt; -
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Finding latest release
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Using v0.8.1 as release
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Downloading hash https:&#x2F;&#x2F;github.com&#x2F;rancher&#x2F;k3s&#x2F;releases&#x2F;download&#x2F;v0.8.1&#x2F;sha256sum-arm.txt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Downloading binary https:&#x2F;&#x2F;github.com&#x2F;rancher&#x2F;k3s&#x2F;releases&#x2F;download&#x2F;v0.8.1&#x2F;k3s-armhf
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Verifying binary download
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Installing k3s to &#x2F;usr&#x2F;local&#x2F;bin&#x2F;k3s
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Creating &#x2F;usr&#x2F;local&#x2F;bin&#x2F;kubectl symlink to k3s
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Creating &#x2F;usr&#x2F;local&#x2F;bin&#x2F;crictl symlink to k3s
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Creating &#x2F;usr&#x2F;local&#x2F;bin&#x2F;ctr symlink to k3s
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Creating killall script &#x2F;usr&#x2F;local&#x2F;bin&#x2F;k3s-killall.sh
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Creating uninstall script &#x2F;usr&#x2F;local&#x2F;bin&#x2F;k3s-uninstall.sh
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  env: Creating environment file &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;k3s.service.env
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  systemd: Creating service file &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;k3s.service
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  systemd: Enabling k3s unit
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Created&lt;&#x2F;span&gt;&lt;span&gt; symlink &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;multi-user.target.wants&#x2F;k3s.service → &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;k3s.service.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  systemd: Starting k3s
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once completed, you can inspect the status of things:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@cbridge$&lt;&#x2F;span&gt;&lt;span&gt; sudo kubectl get nodes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;NAME&lt;&#x2F;span&gt;&lt;span&gt;      STATUS   ROLES    AGE   VERSION
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;cbridge&lt;&#x2F;span&gt;&lt;span&gt;   Ready    master   91s   v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;joining-cm-nodes&quot;&gt;Joining CM Nodes&lt;&#x2F;h2&gt;
&lt;p&gt;In order to join your CM nodes to the cluster, you&#x27;ll need two pieces of info:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;The IP address of your &lt;code&gt;cbridge&lt;&#x2F;code&gt; controller node. Alternately, you could try using the mDNS local name, but I have not tested this.&lt;&#x2F;li&gt;
&lt;li&gt;The secret token that can be used to join the cluster. This can be found in &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;rancher&#x2F;k3s&#x2F;server&#x2F;node-token&lt;&#x2F;code&gt; on the controller.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;With that information on hand, you can run this for your first node:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@p5$&lt;&#x2F;span&gt;&lt;span&gt; curl -sfL https:&#x2F;&#x2F;get.k3s.io &lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span&gt;K3S_URL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;192.168.1.10:6443 &lt;&#x2F;span&gt;&lt;span&gt;K3S_TOKEN&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;SOME_SECRET_TOKEN_VALUE:node:123&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;sh&lt;&#x2F;span&gt;&lt;span&gt; -
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Finding latest release
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Using v0.8.1 as release
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Downloading hash https:&#x2F;&#x2F;github.com&#x2F;rancher&#x2F;k3s&#x2F;releases&#x2F;download&#x2F;v0.8.1&#x2F;sha256sum-arm.txt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Downloading binary https:&#x2F;&#x2F;github.com&#x2F;rancher&#x2F;k3s&#x2F;releases&#x2F;download&#x2F;v0.8.1&#x2F;k3s-armhf
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Verifying binary download
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Installing k3s to &#x2F;usr&#x2F;local&#x2F;bin&#x2F;k3s
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Creating &#x2F;usr&#x2F;local&#x2F;bin&#x2F;kubectl symlink to k3s
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Creating &#x2F;usr&#x2F;local&#x2F;bin&#x2F;crictl symlink to k3s
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Creating &#x2F;usr&#x2F;local&#x2F;bin&#x2F;ctr symlink to k3s
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Creating killall script &#x2F;usr&#x2F;local&#x2F;bin&#x2F;k3s-killall.sh
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  Creating uninstall script &#x2F;usr&#x2F;local&#x2F;bin&#x2F;k3s-agent-uninstall.sh
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  env: Creating environment file &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;k3s-agent.service.env
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  systemd: Creating service file &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;k3s-agent.service
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  systemd: Enabling k3s-agent unit
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Created&lt;&#x2F;span&gt;&lt;span&gt; symlink &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;multi-user.target.wants&#x2F;k3s-agent.service → &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;k3s-agent.service.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[INFO]&lt;&#x2F;span&gt;&lt;span&gt;  systemd: Starting k3s-agent
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Checking the status on things from the control node:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@cbridge$&lt;&#x2F;span&gt;&lt;span&gt; sudo kubectl get nodes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;NAME&lt;&#x2F;span&gt;&lt;span&gt;      STATUS     ROLES    AGE   VERSION
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;cbridge&lt;&#x2F;span&gt;&lt;span&gt;   Ready      master   24h   v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p5&lt;&#x2F;span&gt;&lt;span&gt;        NotReady   worker   1s    v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can see the worker node has joined the cluster, but isn&#x27;t yet ready. Waiting a bit longer, the node should be fully ready:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@cbridge$&lt;&#x2F;span&gt;&lt;span&gt; sudo kubectl get nodes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;NAME&lt;&#x2F;span&gt;&lt;span&gt;      STATUS   ROLES    AGE     VERSION
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;cbridge&lt;&#x2F;span&gt;&lt;span&gt;   Ready    master   24h     v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p5&lt;&#x2F;span&gt;&lt;span&gt;        Ready    worker   2m19s   v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I can then repeat the same thing on the other CM nodes, to finally have the basic Kubernetes cluster up and running:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@cbridge$&lt;&#x2F;span&gt;&lt;span&gt; sudo kubectl get nodes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;NAME&lt;&#x2F;span&gt;&lt;span&gt;      STATUS   ROLES    AGE     VERSION
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;cbridge&lt;&#x2F;span&gt;&lt;span&gt;   Ready    master   24h     v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p5&lt;&#x2F;span&gt;&lt;span&gt;        Ready    worker   5m27s   v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p6&lt;&#x2F;span&gt;&lt;span&gt;        Ready    worker   30s     v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p7&lt;&#x2F;span&gt;&lt;span&gt;        Ready    worker   5s      v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;running-test-pod&quot;&gt;Running test pod&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@cbridge$&lt;&#x2F;span&gt;&lt;span&gt; sudo kubectl run -i --tty alpine --image&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;alpine&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt; --&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;bin&#x2F;ash
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;kubectl&lt;&#x2F;span&gt;&lt;span&gt; run --generator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;deployment&#x2F;apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;run-pod&#x2F;v1 or kubectl create instead.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;If&lt;&#x2F;span&gt;&lt;span&gt; you don&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;#39;t see a command prompt, try pressing enter.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F; #
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Before exiting the prompt, I verified where the pod was running:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@cbridge$&lt;&#x2F;span&gt;&lt;span&gt; sudo kubectl describe pod alpine &lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;^Node:&amp;quot;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Node:&lt;&#x2F;span&gt;&lt;span&gt;               p5&#x2F;192.168.1.208
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;accessing-the-cluster&quot;&gt;Accessing the cluster&lt;&#x2F;h2&gt;
&lt;p&gt;If you want, you can continue to interact with the cluster by first SSH-ing into the &lt;code&gt;cbridge&lt;&#x2F;code&gt; control node.
However, often you&#x27;ll want to interact with the cluster from your local machine. By default, the installed
configuration file is only accessible by root on the controller node, so you&#x27;ll need to cat the content
of the file w&#x2F; sudo, then paste into a local file:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@cbridge$&lt;&#x2F;span&gt;&lt;span&gt; sudo cat &#x2F;etc&#x2F;rancher&#x2F;k3s&#x2F;k3s.yaml
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;apiVersion:&lt;&#x2F;span&gt;&lt;span&gt; v1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;clusters:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; cluster:
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;certificate-authority-data:
&lt;&#x2F;span&gt;&lt;span&gt;    NOTFORYOU&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;=
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;server:&lt;&#x2F;span&gt;&lt;span&gt; https:&#x2F;&#x2F;localhost:6443
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;name:&lt;&#x2F;span&gt;&lt;span&gt; default
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;contexts:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; context:
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;cluster:&lt;&#x2F;span&gt;&lt;span&gt; default
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;user:&lt;&#x2F;span&gt;&lt;span&gt; default
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;name:&lt;&#x2F;span&gt;&lt;span&gt; default
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;current-context:&lt;&#x2F;span&gt;&lt;span&gt; default
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;kind:&lt;&#x2F;span&gt;&lt;span&gt; Config
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;preferences: &lt;&#x2F;span&gt;&lt;span&gt;{}
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;users:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; name: default
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;user:
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;password:&lt;&#x2F;span&gt;&lt;span&gt; OMITTED
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;username:&lt;&#x2F;span&gt;&lt;span&gt; admin
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Openning an editor on your local machine to open &lt;code&gt;~&#x2F;.kube&#x2F;pi-cluster-config&lt;&#x2F;code&gt; and paste in the content.
Once pasted, edit the &lt;code&gt;server&lt;&#x2F;code&gt; line to change &lt;code&gt;localhost&lt;&#x2F;code&gt; to the IP of your cluster, e.g. &lt;code&gt;server: https:&#x2F;&#x2F;192.168.1.10:6443&lt;&#x2F;code&gt;.
&lt;code&gt;k3s&lt;&#x2F;code&gt; by default names all the cluster, user, etc information as &lt;code&gt;default&lt;&#x2F;code&gt;, which isn&#x27;t very helpful locally, so you may also want to replace all instances of &lt;code&gt;default&lt;&#x2F;code&gt; with &lt;code&gt;pi-cluste&lt;&#x2F;code&gt; in the file as well.&lt;&#x2F;p&gt;
&lt;p&gt;To make sure you pick up any &lt;em&gt;existing&lt;&#x2F;em&gt; Kubernetes configuration, as well as the new one, you&#x27;ll want to update your &lt;code&gt;$KUBECONFIG&lt;&#x2F;code&gt; variable. If you already have one set, you can do:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;export &lt;&#x2F;span&gt;&lt;span&gt;KUBECONFIG&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=$&lt;&#x2F;span&gt;&lt;span&gt;KUBECONFIG&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;.kube&#x2F;pi-cluster-config
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you don&#x27;t have any existing value for &lt;code&gt;$KUBECONFIG&lt;&#x2F;code&gt;, you can do:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;export &lt;&#x2F;span&gt;&lt;span&gt;KUBECONFIG&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=$&lt;&#x2F;span&gt;&lt;span&gt;HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;.kube&#x2F;config:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt;HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;.kube&#x2F;pi-cluster-config
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once &lt;code&gt;$KUBECONFIG&lt;&#x2F;code&gt; is set, you can view the merged config:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2e3440;color:#d8dee9;&quot;&gt;&lt;code&gt;&lt;span&gt;kubectl config view
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, you can confirm you can access the cluster by describing the master &lt;code&gt;cbridge&lt;&#x2F;code&gt; node:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; kubectl describe node cbridge
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Name:&lt;&#x2F;span&gt;&lt;span&gt;               cbridge
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Roles:&lt;&#x2F;span&gt;&lt;span&gt;              master
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Labels:&lt;&#x2F;span&gt;&lt;span&gt;             beta.kubernetes.io&#x2F;arch=arm
&lt;&#x2F;span&gt;&lt;span&gt;                    beta.kubernetes.io&#x2F;os&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;linux
&lt;&#x2F;span&gt;&lt;span&gt;                    kubernetes.io&#x2F;arch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;arm
&lt;&#x2F;span&gt;&lt;span&gt;                    kubernetes.io&#x2F;hostname&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;cbridge
&lt;&#x2F;span&gt;&lt;span&gt;                    kubernetes.io&#x2F;os&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;linux
&lt;&#x2F;span&gt;&lt;span&gt;                    node-role.kubernetes.io&#x2F;master&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Annotations:&lt;&#x2F;span&gt;&lt;span&gt;        flannel.alpha.coreos.com&#x2F;backend-data: {&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;VtepMAC&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;quot;0a:f8:e2:7e:94:5f&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;flannel.alpha.coreos.com&#x2F;backend-type:&lt;&#x2F;span&gt;&lt;span&gt; vxlan
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;flannel.alpha.coreos.com&#x2F;kube-subnet-manager:&lt;&#x2F;span&gt;&lt;span&gt; true
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;flannel.alpha.coreos.com&#x2F;public-ip:&lt;&#x2F;span&gt;&lt;span&gt; 192.168.1.10
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;node.alpha.kubernetes.io&#x2F;ttl:&lt;&#x2F;span&gt;&lt;span&gt; 0
&lt;&#x2F;span&gt;&lt;span&gt;                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;volumes.kubernetes.io&#x2F;controller-managed-attach-detach:&lt;&#x2F;span&gt;&lt;span&gt; true
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;CreationTimestamp:&lt;&#x2F;span&gt;&lt;span&gt;  Sat, 07 Sep 2019 23:05:21 -0400
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Taints:             &lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Unschedulable:&lt;&#x2F;span&gt;&lt;span&gt;      false
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Conditions:
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Type&lt;&#x2F;span&gt;&lt;span&gt;             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;----&lt;&#x2F;span&gt;&lt;span&gt;             ------  -----------------                 ------------------                ------                       -------
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;MemoryPressure&lt;&#x2F;span&gt;&lt;span&gt;   False   Mon, 09 Sep 2019 10:03:52 -0400   Sat, 07 Sep 2019 23:05:20 -0400   KubeletHasSufficientMemory   kubelet has sufficient memory available
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;DiskPressure&lt;&#x2F;span&gt;&lt;span&gt;     False   Mon, 09 Sep 2019 10:03:52 -0400   Sat, 07 Sep 2019 23:05:20 -0400   KubeletHasNoDiskPressure     kubelet has no disk pressure
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;PIDPressure&lt;&#x2F;span&gt;&lt;span&gt;      False   Mon, 09 Sep 2019 10:03:52 -0400   Sat, 07 Sep 2019 23:05:20 -0400   KubeletHasSufficientPID      kubelet has sufficient PID available
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Ready&lt;&#x2F;span&gt;&lt;span&gt;            True    Mon, 09 Sep 2019 10:03:52 -0400   Sat, 07 Sep 2019 23:05:32 -0400   KubeletReady                 kubelet is posting ready status. WARNING: CPU hardcapping unsupported
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Addresses:
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;InternalIP:&lt;&#x2F;span&gt;&lt;span&gt;  192.168.1.10
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Hostname:&lt;&#x2F;span&gt;&lt;span&gt;    cbridge
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Capacity:
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;cpu:&lt;&#x2F;span&gt;&lt;span&gt;                4
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ephemeral-storage:&lt;&#x2F;span&gt;&lt;span&gt;  15025172Ki
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;memory:&lt;&#x2F;span&gt;&lt;span&gt;             948308Ki
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pods:&lt;&#x2F;span&gt;&lt;span&gt;               110
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Allocatable:
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;cpu:&lt;&#x2F;span&gt;&lt;span&gt;                4
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ephemeral-storage:&lt;&#x2F;span&gt;&lt;span&gt;  14616487311
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;memory:&lt;&#x2F;span&gt;&lt;span&gt;             948308Ki
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pods:&lt;&#x2F;span&gt;&lt;span&gt;               110
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;System&lt;&#x2F;span&gt;&lt;span&gt; Info:
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Machine&lt;&#x2F;span&gt;&lt;span&gt; ID:                 3390eb2107964e7d9da093e8c1d17922
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;System&lt;&#x2F;span&gt;&lt;span&gt; UUID:                3390eb2107964e7d9da093e8c1d17922
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Boot&lt;&#x2F;span&gt;&lt;span&gt; ID:                    2a3b0c78-a1cd-4a6f-9381-a2faa199e3e8
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Kernel&lt;&#x2F;span&gt;&lt;span&gt; Version:             4.19.66-v7+
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;OS&lt;&#x2F;span&gt;&lt;span&gt; Image:                   Raspbian GNU&#x2F;Linux 10 (buster)
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Operating&lt;&#x2F;span&gt;&lt;span&gt; System:           linux
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Architecture:&lt;&#x2F;span&gt;&lt;span&gt;               arm
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Container&lt;&#x2F;span&gt;&lt;span&gt; Runtime Version:  containerd:&#x2F;&#x2F;1.2.7-k3s1
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Kubelet&lt;&#x2F;span&gt;&lt;span&gt; Version:            v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Kube-Proxy&lt;&#x2F;span&gt;&lt;span&gt; Version:         v1.14.6-k3s.1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;PodCIDR:&lt;&#x2F;span&gt;&lt;span&gt;                     10.42.0.0&#x2F;24
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Non-terminated&lt;&#x2F;span&gt;&lt;span&gt; Pods:         (3 in total)
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Namespace&lt;&#x2F;span&gt;&lt;span&gt;                  Name                        CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;---------&lt;&#x2F;span&gt;&lt;span&gt;                  ----                        ------------  ----------  ---------------  -------------  ---
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;kube-system&lt;&#x2F;span&gt;&lt;span&gt;                coredns-b7464766c-pbbr6     100m (2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt; (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;70Mi&lt;&#x2F;span&gt;&lt;span&gt; (7&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;170Mi&lt;&#x2F;span&gt;&lt;span&gt; (18&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;34h
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;kube-system&lt;&#x2F;span&gt;&lt;span&gt;                svclb-traefik-plckk         0 (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt; (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt; (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt; (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;34h
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;kube-system&lt;&#x2F;span&gt;&lt;span&gt;                traefik-5c79b789c5-m2f77    0 (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt; (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)      &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt; (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt; (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;34h
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Allocated&lt;&#x2F;span&gt;&lt;span&gt; resources:
&lt;&#x2F;span&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Total&lt;&#x2F;span&gt;&lt;span&gt; limits may be over 100 percent, i.e., overcommitted.)
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Resource&lt;&#x2F;span&gt;&lt;span&gt;           Requests   Limits
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;--------&lt;&#x2F;span&gt;&lt;span&gt;           --------   ------
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;cpu&lt;&#x2F;span&gt;&lt;span&gt;                100m (2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt; (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;memory&lt;&#x2F;span&gt;&lt;span&gt;             70Mi (7&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;170Mi&lt;&#x2F;span&gt;&lt;span&gt; (18&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ephemeral-storage&lt;&#x2F;span&gt;&lt;span&gt;  0 (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)     &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt; (0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Events:              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;none&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you&#x27;re happy, make sure to add the export for &lt;code&gt;$KUBECONFIG&lt;&#x2F;code&gt; to your &lt;code&gt;~&#x2F;.bashrc&lt;&#x2F;code&gt; so it is automatic in the future.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;Next Steps&lt;&#x2F;h2&gt;
&lt;p&gt;Next, I&#x27;ll work in setting up things like Kubernetes Dashboard, Prometheus, etc!&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Cluster Triple - A new Kubernetes cluster attempt</title>
		<published>2019-09-06T00:00:00+00:00</published>
		<updated>2019-09-06T00:00:00+00:00</updated>
		<link href="https://petejohanson.dev/blog/cluster-triple-initial-setup/" type="text/html"/>
		<id>https://petejohanson.dev/blog/cluster-triple-initial-setup/</id>
		<content type="html">&lt;h2 id=&quot;cluster-triple-intro&quot;&gt;Cluster Triple Intro&lt;&#x2F;h2&gt;
&lt;p&gt;Since the original &lt;a href=&quot;https:&#x2F;&#x2F;petejohanson.dev&#x2F;blog&#x2F;kubehat-project-suspended&#x2F;&quot;&gt;KubeHat Project&lt;&#x2F;a&gt; was suspended, and the &lt;a href=&quot;&#x2F;pimera-intro&quot;&gt;Pimera Project&lt;&#x2F;a&gt; met with mixed results, I was excited to recently discover that the developer of the &lt;code&gt;ClusterHAT&lt;&#x2F;code&gt; was working on a new effort to cluster Pi Compute Modules, under the umbrella of &lt;code&gt;ClusterCTRL&lt;&#x2F;code&gt;, the first iteration of this being the &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.tindie.com&#x2F;products&#x2F;8086net&#x2F;cluster-triple-for-raspberry-pi-compute-modules&#x2F;&quot;&gt;Cluster Triple&lt;&#x2F;a&gt;, of which there are a few early betas available for developers to try.&lt;&#x2F;p&gt;
&lt;p&gt;An order on Tindie for the board, and another order to PiShop.us, and lo and behold!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;.&#x2F;cluster-triple-unboxing.jpg&quot; alt=&quot;Cluster Triple + Compute Modules&quot; &#x2F;&gt;)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-hardware&quot;&gt;The Hardware&lt;&#x2F;h2&gt;
&lt;p&gt;It&#x27;s easy to see the Cluster Triple as an evolution of the original Cluster HAT.
The new Cluster Triple swaps out the Pi Zeros for the more expensive, but much more powerful
Raspberry Pi Compute Module hardware format. Everything from the CM1 to the most recent CM3+
are compatible. Like the ClusterHAT, the node Pi devices depend on the expansion board being
connected to a &amp;quot;controller&amp;quot; device, to which the nodes will be exposed via USB Gadget mode
to connect virtual serial consoless, and virtual ethernet devices that can either be bridged
or NAT&#x27;d to the controller&#x27;s network connection.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;board-specs&quot;&gt;Board Specs&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Onboard 4-port USB 2.0 hub&lt;&#x2F;li&gt;
&lt;li&gt;ClusterCTRL (I2C) USB interface allows individual control of Pi power, fan, LED, etc.&lt;&#x2F;li&gt;
&lt;li&gt;Programmable power on states for LED, Individual Pi Power, USBBOOT, etc.&lt;&#x2F;li&gt;
&lt;li&gt;Unpopulated pads for ClusterCTRL UART status (for debug)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;compute-modules&quot;&gt;Compute Modules&lt;&#x2F;h3&gt;
&lt;p&gt;I decided to go with the latest CM release, so I purchased three &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.raspberrypi.org&#x2F;products&#x2F;compute-module-3-plus&#x2F;&quot;&gt;Compute Module 3+&lt;&#x2F;a&gt; boards. These boards come in Lite (no eMMC), and 8GB, 16GB, or 32GB eMMC varieties. For mine I purchased
the 16GB versions.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-bit SoC @ 1.2GHz&lt;&#x2F;li&gt;
&lt;li&gt;1GB LPDDR2 SDRAM&lt;&#x2F;li&gt;
&lt;li&gt;16GB eMMC Flash memory&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;hardware-setup&quot;&gt;Hardware Setup&lt;&#x2F;h2&gt;
&lt;p&gt;I assembled the CMs into the Cluster Triple board, attached the provided USB cable to the controller USB port and the &lt;code&gt;USB&lt;&#x2F;code&gt; port on the board, then plugged a micro USB charger into the &lt;code&gt;PWR&lt;&#x2F;code&gt; port on board.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;.&#x2F;cluster-triple-compute-modules-installed.jpg&quot; alt=&quot;Cluster Triple with Compute Modules installed&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;software-setup&quot;&gt;Software Setup&lt;&#x2F;h2&gt;
&lt;p&gt;The latest Cluster Triple Raspbian images have some key variations across two axes:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;The network for the nodes can be either &lt;em&gt;bridged&lt;&#x2F;em&gt; with the controller&#x27;s network interface, or the controller
can use NAT, and the nodes will only have local IPs internal to the private network behind the controller.&lt;&#x2F;li&gt;
&lt;li&gt;The CM devices can either boot using USBBOOT off the controller (with optional data storage on the eMMC flash, if not using the Lite version), or can boot off the included eMMC directly.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;For my particular use case, where I want the nodes to get IPs on my local LAN so I can use Kubernetes NodePort exposing for services, etc. I am going to use the &lt;code&gt;CBRIDGE&lt;&#x2F;code&gt; images, and boot directly off the eMMC with a full OS images on each CM.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;controller-os&quot;&gt;Controller OS&lt;&#x2F;h2&gt;
&lt;p&gt;Since I&#x27;m using the controller itself to flash the images to the CM nodes, I grabbed the individual &lt;code&gt;CBRIDGE - Lite Controller&lt;&#x2F;code&gt; controller image from the &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;clusterhat.com&#x2F;setup-software&quot;&gt;Cluster HAT - Software Setup&lt;&#x2F;a&gt; page.&lt;&#x2F;p&gt;
&lt;p&gt;Once you&#x27;ve downloaded the image, you can write it to the microSD card for the controller:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; dd if=ClusterCTRL-2019-07-10-lite-4-CBRIDGE.img of=&#x2F;dev&#x2F;mmcblk0 bs=4M conv=fsync
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you need to use SSH to log into controller, you&#x27;ll want to mount the boot partition and touch &lt;code&gt;&#x2F;boot&#x2F;ssh&lt;&#x2F;code&gt;,
to ensure it comes up when the controller starts.&lt;&#x2F;p&gt;
&lt;p&gt;From there, you can add the card back to the controller, and plug in the combination of the controller Pi,
and the Cluster Triple board.&lt;&#x2F;p&gt;
&lt;p&gt;Once booted, you can use the mDNS name to SSH into the bridge controller:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; ssh pi@cbridge.local
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@cbridge.local&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;#39;s password:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Linux cbridge 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;The programs included with the Debian GNU&#x2F;Linux system are free software;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;the exact distribution terms for each program are described in the
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;individual files in &#x2F;usr&#x2F;share&#x2F;doc&#x2F;*&#x2F;copyright.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Debian GNU&#x2F;Linux comes with ABSOLUTELY NO WARRANTY, to the extent
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;permitted by applicable law.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Last login: Fri Sep  6 04:33:42 2019 from 192.168.1.86
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;pi@cbridge:~ $
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;initial-status&quot;&gt;Initial status&lt;&#x2F;h2&gt;
&lt;p&gt;Once you log into the bridge controller, you can see the status of the Cluster Triple by running
&lt;code&gt;clusterctrl status&lt;&#x2F;code&gt;. My controller &lt;em&gt;also&lt;&#x2F;em&gt; has the ClusterHAT still on top, so the output includes
the details of that devices:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@cbridge$&lt;&#x2F;span&gt;&lt;span&gt; clusterctrl status
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;clusterhat:1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;clusterctrl:1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;maxpi:7
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ctrl_bus:20:3:3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_version:2.3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_version_major:2
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_version_minor:3
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_size:4
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_uuid:7a840d46-de0a-44e0-9057-f949d0d5e848
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_vendor:8086&lt;&#x2F;span&gt;&lt;span&gt; Consultancy
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_product_id:0x0004
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;throttled:0x0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_alert:0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_hub:1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_wp:1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_led:1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_wplink:0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;hat_xra1200p:True
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p1:0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p2:0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p3:0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p4:0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ctrl20:FW:1.2&lt;&#x2F;span&gt;&lt;span&gt; ADC1:4866mV T1:12.86C
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p5:0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;u5:1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p6:0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;u6:1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p7:0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;u7:1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The key pieces are near the top:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2e3440;color:#d8dee9;&quot;&gt;&lt;code&gt;&lt;span&gt;clusterctrl:1
&lt;&#x2F;span&gt;&lt;span&gt;maxpi:7
&lt;&#x2F;span&gt;&lt;span&gt;ctrl_bus:20:3:3
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And near the end:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2e3440;color:#d8dee9;&quot;&gt;&lt;code&gt;&lt;span&gt;ctrl20:FW:1.2 ADC1:4866mV T1:12.86C
&lt;&#x2F;span&gt;&lt;span&gt;p5:0
&lt;&#x2F;span&gt;&lt;span&gt;u5:1
&lt;&#x2F;span&gt;&lt;span&gt;p6:0
&lt;&#x2F;span&gt;&lt;span&gt;u6:1
&lt;&#x2F;span&gt;&lt;span&gt;p7:0
&lt;&#x2F;span&gt;&lt;span&gt;u7:1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Because of the ClusterHAT, you can see the numbering for the Cluster Triple devices starting at &lt;code&gt;p5&lt;&#x2F;code&gt;.
Initially all three CMs are powered off to start (&lt;code&gt;p5:0&lt;&#x2F;code&gt;), and configured with USBBOOT enabled (&lt;code&gt;u5:0&lt;&#x2F;code&gt;)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installing-raspbian-to-cms&quot;&gt;Installing Raspbian To CMs&lt;&#x2F;h2&gt;
&lt;p&gt;Because I&#x27;m running off the eMMC, I followed the guide for &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;8086.support&#x2F;content&#x2F;23&#x2F;103&#x2F;en&#x2F;clusterctrl-how-to-write-an-image-to-the-emmc.html&quot;&gt;How to write an image to the eMMC&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Once done downloading the P1 image and writing it to the eMMC, I can happily SSH into the nodes:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;.&#x2F;cluster-triple-node-ssh-sessions.png&quot; alt=&quot;tmux view of three SSH sessions&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;Next Steps&lt;&#x2F;h2&gt;
&lt;p&gt;Next, I will be working on getting the controller node running as a Kubernetes control node, and the
three CM nodes setup as Kubernetes nodes!&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Pimera Project: FreeBSD</title>
		<published>2019-08-27T00:00:00+00:00</published>
		<updated>2019-08-27T00:00:00+00:00</updated>
		<link href="https://petejohanson.dev/blog/pimera-freebsd-setup/" type="text/html"/>
		<id>https://petejohanson.dev/blog/pimera-freebsd-setup/</id>
		<content type="html">&lt;p&gt;Based on my &lt;a href=&quot;https:&#x2F;&#x2F;petejohanson.dev&#x2F;blog&#x2F;kubehat-project-suspended&#x2F;&quot;&gt;suspension of the KubeHat project&lt;&#x2F;a&gt; and initial efforts
on my new &lt;a href=&quot;&#x2F;pimera-intro&quot;&gt;Pimera project&lt;&#x2F;a&gt;, my first step is a stab at getting FreeBSD running on
one of the Pi Zeros!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;goals&quot;&gt;Goals&lt;&#x2F;h2&gt;
&lt;p&gt;The following are my goals for getting FreeBSD working on one of the Raspberry Pi Zeros in my
Cluster HAT setup:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Don&#x27;t impact operation of the rest of the cluster.&lt;&#x2F;li&gt;
&lt;li&gt;Latest current FreeBSD (13-CURRENT is the only version that fully worked for me)&lt;&#x2F;li&gt;
&lt;li&gt;Feature parity with Raspbian, including bridged networking, SSH server, mDNS discovery.&lt;&#x2F;li&gt;
&lt;li&gt;All configured to come up automatically on boot&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;I&#x27;m going to be using the &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;wiki.freebsd.org&#x2F;FreeBSD&#x2F;arm&#x2F;Raspberry%20Pi&quot;&gt;FreeBSD Pi wiki page&lt;&#x2F;a&gt; as a starting
point, and going from there.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;disk-image&quot;&gt;Disk Image&lt;&#x2F;h2&gt;
&lt;p&gt;First, I brought down the existing &lt;code&gt;p4&lt;&#x2F;code&gt; Pi Zero from the controller, leaving the rest of the cluster running:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@controller$&lt;&#x2F;span&gt;&lt;span&gt; clusterhat off p4
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once that completed, the status light for the fourth cluster device went dark, and I could remove the SD card and plug it into
my laptop.&lt;&#x2F;p&gt;
&lt;p&gt;Next, I downloaded the latest snapshot disk image from &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;download.freebsd.org&#x2F;ftp&#x2F;snapshots&#x2F;arm&#x2F;armv6&#x2F;ISO-IMAGES&#x2F;&quot;&gt;https:&#x2F;&#x2F;download.freebsd.org&#x2F;ftp&#x2F;snapshots&#x2F;arm&#x2F;armv6&#x2F;ISO-IMAGES&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Once downloaded, from my Linux laptop, I unzipped the image:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;peter@localhost$&lt;&#x2F;span&gt;&lt;span&gt; unxz FreeBSD-13.0-CURRENT-arm-armv6-RPI-B-20190822-r351363.img.xz
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, I wrote the image to my SD card:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;peter@localhost$&lt;&#x2F;span&gt;&lt;span&gt; sudo dd if=FreeBSD-13.0-CURRENT-arm-armv6-RPI-B-20190822-r351363.img of=&#x2F;dev&#x2F;mmcblk0 bs=4M conv=fsync
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;When that completed, I removed the SD card from my laptop, re-inserted it into the fourth Pi Zero slot&lt;&#x2F;p&gt;
&lt;h2 id=&quot;running-freebsd&quot;&gt;Running FreeBSD&lt;&#x2F;h2&gt;
&lt;p&gt;Next, I brought the fourth Pi Zero device back online in the cluster from the controller:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@controller$&lt;&#x2F;span&gt;&lt;span&gt; clusterhat on p4
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;From there, running &lt;code&gt;dmesg&lt;&#x2F;code&gt; I can see eventually the FreeBSD device come live, and register the virtual
serial console:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@controller$&lt;&#x2F;span&gt;&lt;span&gt; dmesg &lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;tail&lt;&#x2F;span&gt;&lt;span&gt; -n 8
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[861430.624826]&lt;&#x2F;span&gt;&lt;span&gt; usb 1-1.2.1: new high-speed USB device number 10 using dwc_otg
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[861435.764830]&lt;&#x2F;span&gt;&lt;span&gt; usb 1-1.2.1: device descriptor read&#x2F;64, error -110
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[861436.017185]&lt;&#x2F;span&gt;&lt;span&gt; usb 1-1.2.1: New USB device found, idVendor=16c0, idProduct=27dd, bcdDevice= 1.00
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[861436.017211]&lt;&#x2F;span&gt;&lt;span&gt; usb 1-1.2.1: New USB device strings: Mfr=2, Product=3, SerialNumber=4
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[861436.017223]&lt;&#x2F;span&gt;&lt;span&gt; usb 1-1.2.1: Product: Virtual serial port
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[861436.017235]&lt;&#x2F;span&gt;&lt;span&gt; usb 1-1.2.1: Manufacturer: The FreeBSD Project (https:&#x2F;&#x2F;www.FreeBSD.org)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[861436.017247]&lt;&#x2F;span&gt;&lt;span&gt; usb 1-1.2.1: SerialNumber: FreeBSD1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[861436.089370]&lt;&#x2F;span&gt;&lt;span&gt; cdc_acm 1-1.2.1:1.0: ttyACM3: USB ACM device
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;logging-into-freebsd&quot;&gt;Logging into FreeBSD&lt;&#x2F;h2&gt;
&lt;p&gt;Using the &lt;code&gt;tio&lt;&#x2F;code&gt; utility (or &lt;code&gt;screen&lt;&#x2F;code&gt;, if you prefer), you can log into FreeBSD on the Pi Zero over the virtual
serial console:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@controller$&lt;&#x2F;span&gt;&lt;span&gt; tio &#x2F;dev&#x2F;ttyACM0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[tio&lt;&#x2F;span&gt;&lt;span&gt; 18:58:58] tio v1.32
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[tio&lt;&#x2F;span&gt;&lt;span&gt; 18:58:58] Press ctrl-t q to quit
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[tio&lt;&#x2F;span&gt;&lt;span&gt; 18:58:58] Connected
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;FreeBSD&#x2F;arm&lt;&#x2F;span&gt;&lt;span&gt; (p4) (&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ttyU0&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;login:
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If using &lt;code&gt;tio&lt;&#x2F;code&gt;, you may need to hit &lt;kbd&gt;Enter&lt;&#x2F;kbd&gt; once to get the login prompt to appear. You can then log
in using the default &lt;code&gt;root:root&lt;&#x2F;code&gt; combo from the base image.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;usb-device-mode-network-device&quot;&gt;USB Device Mode Network Device&lt;&#x2F;h2&gt;
&lt;p&gt;In order to access the FreeBSD Pi over SSH, we&#x27;ll need to get FreeBSD to create a virtual ethernet device
via USB device mode that the main controller Pi will bridge to the physical ethernet adapter on that device.&lt;&#x2F;p&gt;
&lt;p&gt;Taking inspiration from the instructions from the &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.freebsd.org&#x2F;doc&#x2F;en_US.ISO8859-1&#x2F;books&#x2F;handbook&#x2F;usb-device-mode-network.html&quot;&gt;FreeBSD Handbook&lt;&#x2F;a&gt;, well edit &lt;code&gt;&#x2F;boot&#x2F;loader.conf&lt;&#x2F;code&gt;, using &lt;code&gt;vi&lt;&#x2F;code&gt; to do so (which is part of base) to do the following:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Change the USB template mode to &lt;code&gt;8&lt;&#x2F;code&gt; so we get both serial console and networking. See &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.freebsd.org&#x2F;cgi&#x2F;man.cgi?query=usb_template&amp;amp;sektion=4&amp;amp;manpath=freebsd-release-ports&quot;&gt;usb_template(4)&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Make sure the &lt;code&gt;if_cdce&lt;&#x2F;code&gt; driver is loaded at boot, so the network device can load.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;You should end up with the following lines in that file:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2e3440;color:#d8dee9;&quot;&gt;&lt;code&gt;&lt;span&gt;if_cdce_load=&amp;quot;YES&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;hw.usb.template=8
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then reboot FreeBSD:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;root#&lt;&#x2F;span&gt;&lt;span&gt; reboot
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once the device reboots, you should see a new line in the &lt;code&gt;dmesg&lt;&#x2F;code&gt; output:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@controller$&lt;&#x2F;span&gt;&lt;span&gt; dmesg &lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;tail&lt;&#x2F;span&gt;&lt;span&gt; -n 1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;[864885.946765]&lt;&#x2F;span&gt;&lt;span&gt; cdc_ether 1-1.2.1:1.2 usb0: register &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;#39;cdc_ether&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; at usb-3f980000.usb-1.2.1, CDC Ethernet Device, 2a:02:03:04:05:06
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Unfortunatly, the MAC address that FreeBSD will use for the USB ethernet device will not match the ones originally configured
in the Cluster HAT Raspbian images, and so the newly created device on the controller side will be &lt;code&gt;usb0&lt;&#x2F;code&gt;, and not properly
bridged automatically:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@controller$&lt;&#x2F;span&gt;&lt;span&gt; ifconfig usb0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;usb0:&lt;&#x2F;span&gt;&lt;span&gt; flags=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;4099&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;UP,BROADCAST,MULTICAST&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;  mtu 1500
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ether&lt;&#x2F;span&gt;&lt;span&gt; 2a:02:03:04:05:06  txqueuelen 1000  (Ethernet)
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;RX&lt;&#x2F;span&gt;&lt;span&gt; packets 0  bytes 0 (0.0 B)
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;RX&lt;&#x2F;span&gt;&lt;span&gt; errors 0  dropped 0  overruns 0  frame 0
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;TX&lt;&#x2F;span&gt;&lt;span&gt; packets 0  bytes 0 (0.0 B)
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;TX&lt;&#x2F;span&gt;&lt;span&gt; errors 0  dropped 0 overruns 0  carrier 0  collisions 0
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To fix this, we&#x27;ll note the MAC address, e.g. &lt;code&gt;2a:02:03:04:05:06&lt;&#x2F;code&gt; and update the file &lt;code&gt;&#x2F;etc&#x2F;udev&#x2F;rules.d&#x2F;90-clusterhat.rules&lt;&#x2F;code&gt; with that
MAC address, Since I&#x27;m using &lt;code&gt;p4&lt;&#x2F;code&gt; for my FreeBSD instance, I&#x27;ll update the line like so:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2e3440;color:#d8dee9;&quot;&gt;&lt;code&gt;&lt;span&gt;SUBSYSTEM==&amp;quot;net&amp;quot;, ATTR{address}==&amp;quot;2a:02:03:04:05:06&amp;quot;, NAME=&amp;quot;ethpi4&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, rebooting the FreeBSD instance from the serial console should show the following &lt;code&gt;dmesg&lt;&#x2F;code&gt; output from the controller:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2e3440;color:#d8dee9;&quot;&gt;&lt;code&gt;&lt;span&gt;[81069.650887] usb 1-1.2.1: new high-speed USB device number 22 using dwc_otg
&lt;&#x2F;span&gt;&lt;span&gt;[81074.780880] usb 1-1.2.1: device descriptor read&#x2F;64, error -110
&lt;&#x2F;span&gt;&lt;span&gt;[81075.033585] usb 1-1.2.1: New USB device found, idVendor=16c0, idProduct=05dc, bcdDevice= 1.00
&lt;&#x2F;span&gt;&lt;span&gt;[81075.033603] usb 1-1.2.1: New USB device strings: Mfr=6, Product=7, SerialNumber=8
&lt;&#x2F;span&gt;&lt;span&gt;[81075.033615] usb 1-1.2.1: Product: Serial&#x2F;Ethernet device
&lt;&#x2F;span&gt;&lt;span&gt;[81075.033628] usb 1-1.2.1: Manufacturer: The FreeBSD Project (https:&#x2F;&#x2F;www.FreeBSD.org)
&lt;&#x2F;span&gt;&lt;span&gt;[81075.033639] usb 1-1.2.1: SerialNumber: FreeBSD1
&lt;&#x2F;span&gt;&lt;span&gt;[81075.116046] cdc_acm 1-1.2.1:1.0: ttyACM0: USB ACM device
&lt;&#x2F;span&gt;&lt;span&gt;[81075.121932] cdc_ether 1-1.2.1:1.2 usb0: register &amp;#39;cdc_ether&amp;#39; at usb-3f980000.usb-1.2.1, CDC Ethernet Device, 2a:02:03:04:05:06
&lt;&#x2F;span&gt;&lt;span&gt;[81075.200713] cdc_ether 1-1.2.1:1.2 ethpi4: renamed from usb0
&lt;&#x2F;span&gt;&lt;span&gt;[81075.555493] br0: port 3(ethpi4) entered blocking state
&lt;&#x2F;span&gt;&lt;span&gt;[81075.555506] br0: port 3(ethpi4) entered disabled state
&lt;&#x2F;span&gt;&lt;span&gt;[81075.556209] device ethpi4 entered promiscuous mode
&lt;&#x2F;span&gt;&lt;span&gt;[81075.620942] br0: port 3(ethpi4) entered blocking state
&lt;&#x2F;span&gt;&lt;span&gt;[81075.620957] br0: port 3(ethpi4) entered forwarding state
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now that the controller side is configured, we&#x27;ll set up DHCP inside of FreeBSD, via the serial console.
Edit &lt;code&gt;&#x2F;etc&#x2F;rc.conf&lt;&#x2F;code&gt; to add the following line:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2e3440;color:#d8dee9;&quot;&gt;&lt;code&gt;&lt;span&gt;ifconfig_ue0=&amp;quot;SYNCDHCP&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Where &lt;code&gt;ue0&lt;&#x2F;code&gt; is the name of the USB mode ethernet device that FreeBSD creates. Once that is done, run the
following from FreeBSD:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;root#&lt;&#x2F;span&gt;&lt;span&gt; service netif restart
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;dhclient&lt;&#x2F;span&gt;&lt;span&gt; not running&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;?&lt;&#x2F;span&gt;&lt;span&gt; (check &#x2F;var&#x2F;run&#x2F;dhclient&#x2F;dhclient.ue0.pid)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Stopping&lt;&#x2F;span&gt;&lt;span&gt; Network: lo0 ue0.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;lo0:&lt;&#x2F;span&gt;&lt;span&gt; flags=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;8048&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;LOOPBACK,RUNNING,MULTICAST&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; metric 0 mtu 16384
&lt;&#x2F;span&gt;&lt;span&gt;        options&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;680003&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;groups:&lt;&#x2F;span&gt;&lt;span&gt; lo
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;nd6&lt;&#x2F;span&gt;&lt;span&gt; options=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;21&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;PERFORMNUD,AUTO_LINKLOCAL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ue0:&lt;&#x2F;span&gt;&lt;span&gt; flags=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;8802&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;BROADCAST,SIMPLEX,MULTICAST&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; metric 0 mtu 1500
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ether&lt;&#x2F;span&gt;&lt;span&gt; 2a:02:03:04:05:f9
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;nd6&lt;&#x2F;span&gt;&lt;span&gt; options=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;29&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Starting&lt;&#x2F;span&gt;&lt;span&gt; dhclient.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;DHCPREQUEST&lt;&#x2F;span&gt;&lt;span&gt; on ue0 to 255.255.255.255 port 67
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;DHCPACK&lt;&#x2F;span&gt;&lt;span&gt; from 192.168.1.1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;bound&lt;&#x2F;span&gt;&lt;span&gt; to 192.168.1.212&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt; --&lt;&#x2F;span&gt;&lt;span&gt; renewal in 43200 seconds.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Starting&lt;&#x2F;span&gt;&lt;span&gt; Network: lo0 ue0.
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;lo0:&lt;&#x2F;span&gt;&lt;span&gt; flags=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;8049&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;UP,LOOPBACK,RUNNING,MULTICAST&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; metric 0 mtu 16384
&lt;&#x2F;span&gt;&lt;span&gt;        options&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;680003&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;inet6&lt;&#x2F;span&gt;&lt;span&gt; ::1 prefixlen 128
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;inet6&lt;&#x2F;span&gt;&lt;span&gt; fe80::1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;lo0 prefixlen 64 scopeid 0x1
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;inet&lt;&#x2F;span&gt;&lt;span&gt; 127.0.0.1 netmask 0xff000000
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;groups:&lt;&#x2F;span&gt;&lt;span&gt; lo
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;nd6&lt;&#x2F;span&gt;&lt;span&gt; options=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;21&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;PERFORMNUD,AUTO_LINKLOCAL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ue0:&lt;&#x2F;span&gt;&lt;span&gt; flags=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;8843&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; metric 0 mtu 1500
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;ether&lt;&#x2F;span&gt;&lt;span&gt; 2a:02:03:04:05:f9
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;inet&lt;&#x2F;span&gt;&lt;span&gt; 192.168.1.212 netmask 0xffffff00 broadcast 192.168.1.255
&lt;&#x2F;span&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;nd6&lt;&#x2F;span&gt;&lt;span&gt; options=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;29&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL&lt;&#x2F;span&gt;&lt;span style=&quot;color:#81a1c1;&quot;&gt;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After that, you should have working network access from the FreeBSD Pi:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;root#&lt;&#x2F;span&gt;&lt;span&gt; ping google.com
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;PING&lt;&#x2F;span&gt;&lt;span&gt; google.com (172.217.10.238)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; 56 data bytes
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span&gt; bytes from lga25s59-in-f14.1e100.net (172.217.10.238)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; icmp_seq=0 ttl=56 time=36.768 ms
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;64&lt;&#x2F;span&gt;&lt;span&gt; bytes from lga25s59-in-f14.1e100.net (172.217.10.238)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; icmp_seq=1 ttl=56 time=35.297 ms
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;passwords-hostname-ntp&quot;&gt;Passwords, Hostname, NTP&lt;&#x2F;h2&gt;
&lt;p&gt;Next, you should update the passwords for &lt;code&gt;root&lt;&#x2F;code&gt; and &lt;code&gt;freebsd&lt;&#x2F;code&gt; users:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;mark style=&quot;background-color:#434c5e52;&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;root#&lt;&#x2F;span&gt;&lt;span&gt; passwd
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Changing&lt;&#x2F;span&gt;&lt;span&gt; local password for root
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;New&lt;&#x2F;span&gt;&lt;span&gt; Password:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Retype&lt;&#x2F;span&gt;&lt;span&gt; New Password:
&lt;&#x2F;span&gt;&lt;mark style=&quot;background-color:#434c5e52;&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;root#&lt;&#x2F;span&gt;&lt;span&gt; passwd freebsd
&lt;&#x2F;span&gt;&lt;&#x2F;mark&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Changing&lt;&#x2F;span&gt;&lt;span&gt; local password for freebsd
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;New&lt;&#x2F;span&gt;&lt;span&gt; Password:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;Retype&lt;&#x2F;span&gt;&lt;span&gt; New Password:
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You should update the hostname in &lt;code&gt;&#x2F;etc&#x2F;rc.conf&lt;&#x2F;code&gt; to match the numbered Pi Zero, e.g. &lt;code&gt;p4&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2e3440;color:#d8dee9;&quot;&gt;&lt;code&gt;&lt;span&gt;hostname=&amp;quot;p4&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Because there is not persistent real time clock on the Pi Zero, you&#x27;ll want to enable &lt;code&gt;ntpd&lt;&#x2F;code&gt; in &lt;code&gt;&#x2F;etc&#x2F;rc.conf&lt;&#x2F;code&gt;
as well so you have accurate time on the device:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2e3440;color:#d8dee9;&quot;&gt;&lt;code&gt;&lt;span&gt;ntpd_enable=&amp;quot;YES&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;ntpd_sync_on_start=&amp;quot;YES&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once enabled, reboot your FreeBSD Pi once more for all the changes to take effect.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;using-pkg-for-package-management&quot;&gt;Using pkg for package management&lt;&#x2F;h2&gt;
&lt;p&gt;See the &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.freebsd.org&#x2F;doc&#x2F;handbook&#x2F;ports.html&quot;&gt;Packages and Ports&lt;&#x2F;a&gt; handbook section
for setting up &lt;code&gt;pkg&lt;&#x2F;code&gt; and adding packages like &lt;code&gt;neovim&lt;&#x2F;code&gt;, &lt;code&gt;tmux&lt;&#x2F;code&gt;, etc.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;multicast-dns-i-e-zeroconf-configuration&quot;&gt;Multicast DNS (i.e. ZeroConf) Configuration&lt;&#x2F;h2&gt;
&lt;p&gt;I haven&#x27;t yet been able to get mDNS working for the FreeBSD instance. In particular,
the &lt;code&gt;mDNSResponderPosix&lt;&#x2F;code&gt; keeps segfaulting after starting. Perhaps at a later date
I will recompile with debug symbols and dig into the details.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;end-result&quot;&gt;End Result&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;petejohanson.dev&#x2F;blog&#x2F;pimera-freebsd-setup&#x2F;pimera-freebsd-final-ssh-login.png&quot; alt=&quot;FreeBSD SSH Login on Raspberry Pi Zero&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pimera-progress&quot;&gt;Pimera Progress&lt;&#x2F;h2&gt;
&lt;p&gt;So far, we&#x27;ve got the following completed for the Primera Project&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;petejohanson.dev&#x2F;blog&#x2F;pimera-freebsd-setup&#x2F;pimera-freebsd.png&quot; alt=&quot;Pimera Progress&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;next-step-alpine-linux&quot;&gt;Next Step: Alpine Linux&lt;&#x2F;h2&gt;
&lt;p&gt;NetBSD I&#x27;m not sure in fact supports the &amp;quot;USB Gadget&amp;quot; functionality, so I&#x27;m going to try to get
Alpine Linux going on &lt;code&gt;p2&lt;&#x2F;code&gt; next!&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>KubeHat Project Suspended</title>
		<published>2019-08-26T00:00:00+00:00</published>
		<updated>2019-08-26T00:00:00+00:00</updated>
		<link href="https://petejohanson.dev/blog/kubehat-project-suspended/" type="text/html"/>
		<id>https://petejohanson.dev/blog/kubehat-project-suspended/</id>
		<content type="html">&lt;p&gt;Going into this project, I knew there was going to be an unhill battle, since the Pi Zeros on the hat run ARMv6.
Debian&#x2F;Ubuntu only target ARMv7 with their &lt;code&gt;armhf&lt;&#x2F;code&gt; packages, so many packages built for ARM from other ISVs, e.g.
kubernetes, docker, etc are built targetting ARMv7 as well.&lt;&#x2F;p&gt;
&lt;p&gt;After the initial Raspbian setup, I had some early successes, getting things like &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;buildah.io&#x2F;&quot;&gt;buildah&lt;&#x2F;a&gt;,
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;podman.io&#x2F;&quot;&gt;podman&lt;&#x2F;a&gt;, and &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;cri-o.io&#x2F;&quot;&gt;cri-o&lt;&#x2F;a&gt; as working.&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunatly, further digging on Kubernetes itself has revealed that all semi-recent versions require the &lt;code&gt;cpuset&lt;&#x2F;code&gt; cgroups
functionality. Attempting to compile the kernel with that feature reveals that it can only be enabled if SMP is enable,
which isn&#x27;t an option on the ARMv6 platform at all. Argh!&lt;&#x2F;p&gt;
&lt;p&gt;Given that reality, I&#x27;m going to (temporarily?) suspend my efforts on KubeHat. If such a time as the Raspberry Pi Foundation
releases a model in the Pi Zero format with an updated SoC based on the ARMv7 architecture, I&#x27;m excited to take another
stab at this.&lt;&#x2F;p&gt;
&lt;p&gt;In the meantime, I will be doing two things.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Trying to get (Pi-hole)[https:&#x2F;&#x2F;pi-hole.net&#x2F;] running via Podman on the main ARMv7 controller board.&lt;&#x2F;li&gt;
&lt;li&gt;A new project that came to me while not sleeping...&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;coming-soon-raspberry-pi-chimera-pimera&quot;&gt;Coming Soon: Raspberry Pi + Chimera = Pimera&lt;&#x2F;h2&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Pimera Project Intro</title>
		<published>2019-08-26T00:00:00+00:00</published>
		<updated>2019-08-26T00:00:00+00:00</updated>
		<link href="https://petejohanson.dev/blog/pimera-intro/" type="text/html"/>
		<id>https://petejohanson.dev/blog/pimera-intro/</id>
		<content type="html">&lt;h2 id=&quot;raspberry-pi-chimera-pimera&quot;&gt;Raspberry Pi + Chimera = Pimera&lt;&#x2F;h2&gt;
&lt;p&gt;Since the original &lt;a href=&quot;https:&#x2F;&#x2F;petejohanson.dev&#x2F;blog&#x2F;kubehat-project-intro&#x2F;&quot;&gt;KubeHat&lt;&#x2F;a&gt; is on hold, I was inspired to instead try to create the most
diverse single Raspberry Pi cluster I could imagine. Inspired by the mythical &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Chimera_(mythology)&quot;&gt;Chimera&lt;&#x2F;a&gt;,
I&#x27;ve decided to call this effort, &amp;quot;Pimera&amp;quot;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;planned-operating-systems&quot;&gt;Planned Operating Systems&lt;&#x2F;h2&gt;
&lt;p&gt;This list may get revised, but my current rough plan is:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;controller&quot;&gt;Controller&lt;&#x2F;h3&gt;
&lt;p&gt;I plan to stick with Raspbian Buster for the main controller. I will probably do a fresh install of this, plus my various podman, etc. dependencies, to get rid of some of the Kubernetes cruft that accumulated from my efforts there. The main advantage here is getting the
basic &lt;code&gt;clusterhat&lt;&#x2F;code&gt; CLI and the briding network setup from the base Cluster HAT provided images, and avoid having to set that up myself.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pi-zeros&quot;&gt;Pi Zeros&lt;&#x2F;h3&gt;
&lt;p&gt;The following is my current OS target list for the Pi Zeros on the Cluster HAT:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;wiki.freebsd.org&#x2F;FreeBSD&#x2F;arm&#x2F;Raspberry%20Pi&quot;&gt;FreeBSD&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.netbsd.org&#x2F;&quot;&gt;NetBSD&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;wiki.alpinelinux.org&#x2F;wiki&#x2F;Installation&quot;&gt;Alpine Linux&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;TBD&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;next-up-freebsd-for-the-pi-zero&quot;&gt;Next Up: FreeBSD for the Pi Zero&lt;&#x2F;h2&gt;
&lt;p&gt;Next up, I&#x27;ll document setting up FreeBSD on the Pi Zero.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>KubeHat Project Software Setup</title>
		<published>2019-08-06T00:00:00+00:00</published>
		<updated>2019-08-06T00:00:00+00:00</updated>
		<link href="https://petejohanson.dev/blog/kubehat-project-software-setup/" type="text/html"/>
		<id>https://petejohanson.dev/blog/kubehat-project-software-setup/</id>
		<content type="html">&lt;p&gt;The clusterhat website provides &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;clusterhat.com&#x2F;setup-software&quot;&gt;custom Rasbian images&lt;&#x2F;a&gt; for both the controller and Zero devices, that includes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;clusterhat&lt;&#x2F;code&gt; utility to control power&#x2F;hub to the Zeros via i2c.&lt;&#x2F;li&gt;
&lt;li&gt;Networking setup for brudge&#x2F;NAT so all devices can connect to the network via the ethernet port on the controller.&lt;&#x2F;li&gt;
&lt;li&gt;Hostnames for &lt;code&gt;controller&lt;&#x2F;code&gt;, &lt;code&gt;p1&lt;&#x2F;code&gt;, &lt;code&gt;p2&lt;&#x2F;code&gt;, etc as well as avahi setup so you can easily SSH to &lt;code&gt;p1.local&lt;&#x2F;code&gt; etc from your local machine.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The custom images do &lt;em&gt;not&lt;&#x2F;em&gt; enable &lt;code&gt;sshd&lt;&#x2F;code&gt; automatically, and since I&#x27;m only ever going to have this cluster networked, and to avoid having to fiddle with HDMI cables, before copying the images to the SD cards, I mounted each image and added the &lt;code&gt;&#x2F;boot&#x2F;ssh&lt;&#x2F;code&gt; file as normal. You &lt;em&gt;could&lt;&#x2F;em&gt; get away with only enabling &lt;code&gt;sshd&lt;&#x2F;code&gt; on the controller, and accessing the Pi Zeros via the serial console if you&#x27;d rather do that.&lt;&#x2F;p&gt;
&lt;p&gt;Once you have the images copied to the SD cards and they are inserted to all the Pis, you can power on the controller. From there, assuming you&#x27;ve set up mDNS resolution on your local machine (macOS has this OOTB, many Linux distros as well), you can SSH into your controller using the password &lt;code&gt;clusterhat&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; ssh pi@controller.local
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once in the controller, you&#x27;ll likely want to do to &lt;code&gt;raspi-config --expand-rootfs&lt;&#x2F;code&gt; to expand the partitions to use the whole SD card before continuing. Once that is done and you&#x27;ve restared the controller Pi, you can ssh back in and use the following command to power on the Pi Zeros:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@controller$&lt;&#x2F;span&gt;&lt;span&gt; clusterhat on
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After that, you should see the status lights for the Zeros illuminate, and running &lt;code&gt;dmesg&lt;&#x2F;code&gt; should show various USB gadget devices showing up, along with their network adapters, and tty devices for serial console connections.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pi-zero-access&quot;&gt;Pi Zero Access&lt;&#x2F;h2&gt;
&lt;p&gt;If you didn&#x27;t enable SSH on the Zeros. then you can access the serial console on the TTY devices from the &lt;code&gt;controller&lt;&#x2F;code&gt;, e.g. &lt;code&gt;ttyACM0&lt;&#x2F;code&gt;, using screen:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@controller$&lt;&#x2F;span&gt;&lt;span&gt; apt-get install screen
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@controller$&lt;&#x2F;span&gt;&lt;span&gt; screen &#x2F;dev&#x2F;ttyACM0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;p1&lt;&#x2F;span&gt;&lt;span&gt; login:
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Alternately, you can just ssh into the Zeros using the mDNS name, e.g. &lt;code&gt;p1.local&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2e3440;color:#d8dee9;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; ssh pi@p1.local
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#88c0d0;&quot;&gt;pi@p1.local&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;#39;s password:
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;t-mux-synchronization&quot;&gt;T-Mux Synchronization&lt;&#x2F;h2&gt;
&lt;p&gt;A note about performing the same steps on all the Pi Zero devices in the cluster. Leveraging &lt;code&gt;tmux&lt;&#x2F;code&gt;&#x27;s ability to synchronize
a set of panes makes performing bulk operations on all devices a breeze. In a nutshell, I use the following process whenever I need to do
the same actions on all four Zeros:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;SSH into the &lt;code&gt;controller&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Run &lt;code&gt;tmux&lt;&#x2F;code&gt; (install this first w&#x2F; &lt;code&gt;apt-get install tmux&lt;&#x2F;code&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Use &lt;code&gt;C-b &amp;quot;&lt;&#x2F;code&gt; and &lt;code&gt;C-b %&lt;&#x2F;code&gt; to open four panes, &lt;code&gt;C-b&lt;&#x2F;code&gt; and the arrows to navigate as needed.&lt;&#x2F;li&gt;
&lt;li&gt;Use &lt;code&gt;C-b&lt;&#x2F;code&gt; + arrow keys to switch to each pane, and SSH into each Zero, or start up screen sessions on each TTY device.&lt;&#x2F;li&gt;
&lt;li&gt;Once all four devices are at the same state, with an active logged in session, use &lt;code&gt;C-b :set synchronize-panes&amp;lt;Enter&amp;gt;&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Now, anything typed into tmux, pasted, etc will be sent to all four Pi Zero sessions, such as running dist upgrades, installing packages, editing files, etc.&lt;&#x2F;li&gt;
&lt;li&gt;Once you&#x27;re done, you can do &lt;code&gt;C-b :set synchronize-panes off&amp;lt;Enter&amp;gt;&lt;&#x2F;code&gt; to stop synchronizing.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;img src=&quot;.&#x2F;tmux-multiplex-zero-operations.png&quot; alt=&quot;tmux session multiplexing dist-upgrade on all four Pi Zeros&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;aside&gt;
Note: Most of the time I do this by first SSH-ing into the controller device &lt;em&gt;first&lt;&#x2F;em&gt;. I do this, so that if for whatever reason
my local workstation disconnects, sleeps, etc. then the tmux session on the controller will &lt;em&gt;persist&lt;&#x2F;em&gt;, including the child sessions
on each Zero, and I can SSH back into &lt;code class=&quot;language-text&quot;&gt;controller&lt;&#x2F;code&gt; and then &lt;code class=&quot;language-text&quot;&gt;tmux attach&lt;&#x2F;code&gt; to get back to what I was working on.
&lt;&#x2F;aside&gt;
&lt;h2 id=&quot;expand-partitions&quot;&gt;Expand Partitions&lt;&#x2F;h2&gt;
&lt;p&gt;Similar to the controller, you&#x27;ll want to expand the root filesystem for the Zeros. Setup the synchronized tmux sessions as described above, then run &lt;code&gt;raspi-config --expand-rootfs&lt;&#x2F;code&gt;. Once completed, reboot the Zeros to complete the process.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;password-update-for-pi-user&quot;&gt;Password Update For pi User&lt;&#x2F;h2&gt;
&lt;p&gt;For the controller, and for any of the Zeros that have SSH enabled, you&#x27;ll want to change the default &lt;code&gt;pi&lt;&#x2F;code&gt; user password.
Using tmux to multiplex the following steps to all the devices, including the controller, if you want:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;.&#x2F;tmux-multiplex-passwd.png&quot; alt=&quot;Updating device passwords collectively&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;next-steps&quot;&gt;Next Steps&lt;&#x2F;h2&gt;
&lt;p&gt;Next post, I&#x27;ll dive into my efforts to get the dependencies for running Kubernetes installed for the controller Pi, and the &lt;code&gt;armv6&lt;&#x2F;code&gt;-based Pi Zeros, which present a challenge since many packages build for Debian&#x2F;Ubuntu are &lt;code&gt;armv7&lt;&#x2F;code&gt;-compatible only.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>KubeHat Project Intro</title>
		<published>2019-08-05T00:00:00+00:00</published>
		<updated>2019-08-05T00:00:00+00:00</updated>
		<link href="https://petejohanson.dev/blog/kubehat-project-intro/" type="text/html"/>
		<id>https://petejohanson.dev/blog/kubehat-project-intro/</id>
		<content type="html">&lt;p&gt;A while back, I read &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.hanselman.com&#x2F;blog&#x2F;HowToBuildAKubernetesClusterWithARMRaspberryPiThenRunNETCoreOnOpenFaas.aspx&quot;&gt;this post&lt;&#x2F;a&gt; by Scott Hanselman about his project to set up a Raspberry Pi cluster. More recently, I stumbled upon the very cool &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;clusterhat.com&#x2F;&quot;&gt;Cluster HAT&lt;&#x2F;a&gt; add-on for the Raspberry Pi. In a nutshell, its a simple HAT that allows adding four Pi Zeros all connected to the main controller Pi via USB Gadget mode. The Zeros can either piggyback on the controllers network connection in bridged or NAT mode, or use wireless to connect independently to the network if using Zero W&#x27;s.&lt;&#x2F;p&gt;
&lt;p&gt;At the time, there was no availability to buy Cluster HATs that could ship to the US reasonably, so I shelved the idea. Recently, the minor revision Cluster HAT v2.3 was released, and with it I was able to find a full kit, with four Pi Zero W&#x27;s, the HAT, and the necessary microSD cards for a good price on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.pishop.us&#x2F;product&#x2F;cluster-hat-kit-includes-4-x-raspberry-pi-zero-w&#x2F;&quot;&gt;PiShop.us&lt;&#x2F;a&gt;. To boot, they had a &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.pishop.us&#x2F;product&#x2F;cluster-hat-case&#x2F;&quot;&gt;nice case&lt;&#x2F;a&gt; available for only $16 more.&lt;&#x2F;p&gt;
&lt;p&gt;I decided to go for it, and ordered the kit and the case, since I already had a Pi 3B+ at home that wasn&#x27;t getting much use.&lt;&#x2F;p&gt;
&lt;p&gt;Once i received the shipment, the assembly was fairly straightforward using &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;thepihut.com&#x2F;blogs&#x2F;raspberry-pi-tutorials&#x2F;clusterhat-case-assembly-instructions&quot;&gt;this guide&lt;&#x2F;a&gt;. The case included all the necessary risers to add the HAT and nicely place the combination of the controllers and Zero&#x27;s. Included are some clear light tubes to bring the indicator lights for the HAT to the surface of the case. after removing the surface tape as needed, i had to do some gentle sanding on a few rough corners to make them slide into place. The final product was a nice little cluster of Pis.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;final-build&quot;&gt;Final Build&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;.&#x2F;clusterhat-case-final-assembly.jpg&quot; alt=&quot;ClusterHAT Case Assembly&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Next post, I&#x27;ll outline the steps I used to getting basic software and control running, and following that I&#x27;ll explore my attempts at getting Kubernetes up and running.&lt;&#x2F;p&gt;
</content>
	</entry>
</feed>