Setting up k3s on a single RPi4

Testing out the ability to run some containers on RPi4 and I have a single borrowed device. Most of the tutorials out there describe a multi-node configuration and that’s led to some challenges for me to understand this. First, I started with this tutorial:

This gets you there most of the way, but I found a few errors in the configuration. First, the port forward config needs to include “–address” where the IP address is the external IP of your RPi.

Second, the token retrieval for logging into the dashboard was not correct. Here’s what I used instead:

kubectl get secrets
kubectl describe secret kdash-kubernetes-dashboard-token-mwgj5

The designator for your instance may be different after the token part of the name. Copying that token into the login allowed me to get into the dashboard.

I’m now having a problem with the dashboard throwing a bunch of errors. I’ll update when I have that worked out.

The RPi Zero W is…ok…

First of all, I have not returned to using the Chromecast for my Grafana visualization. I didn’t elaborate on this, but my previous post was driven by a change to Grafana visualization that effectively broke the ChromeCast Kiosk server I was using. The recommended solution was to use a proxy for displaying the iFrame, or something. I wasn’t keen on setting up another server instance (not that big a deal) just for the purpose of running the proxy. Yes, I know I could have set that up on the same kiosk server.

I quickly implemented the RPi Zero W I referenced in my previous post, just to get something up and running. It works ok in kiosk mode. There are a couple of issues that are relatively minor. It’s only remotely managed via SSH. The previous Chromecast was managed from the server. Very simple to make adjustments with that. Any adjustments to the RPi must be made via SSH. I’m comfortable with that, but I don’t access the RPi enough for it not to be a little relearning every time.

The RPi will not dynamically update a Grafana dashboard. I’m sure I could script it to reload on a certain interval. This was also a benefit of the ChromeCast server. Well, sort of a benefit. The CC Server could have a refresh interval which would reload the page. You could also manually force the refresh. My only way to do that with the RPi is to pull the power, or SSH in and reboot it. Or figure out how to script it. Which brings me to the big negative to the RPi…

This thing is slow. So….slow…. Doesn’t really matter when the dashboard is up and running. It will happily do the Grafana 1 minute refresh without issue. A reboot takes something like 10 minutes before the dashboard is fully drawn. Even the SSH session is pokey. Slow…. The Zero is still running the same CPU as the RPi 1, just a little overclocked. You’d think they could move to the RPi 2/3 CPU at this point and still keep the price down.

Which brings me to the reason I’m sticking with this as my solution. The Zero W is $10. The current generation CC is going for at least $30 and seems to rarely be on sale for less. A third of the cost sure buys a lot of patience with the other issues I have. The Zero W works fine with USB power from the TV, and can usually be hidden behind the TV with some double-sided tape. No case needed. Ok, you need to spend a few bucks on a SD card.

Could be a nice solution for a NOC full of TVs!

Azure AD Joined device ownership change

If you’ve done an Azure Ad Join for a device and found that you (the admin) is now the owner, it can create certain problems for you. If you’re going through an AutoPilot deployment the end user will end up being the owner. So, how do you modify the device owner to be the recipient of the device if you did the setup?

Get-AzureADUser -SearchString username

  • Run for both new user and current user

Get-AzureADDevice -All $true | Where-Object {$_.DeviceTrustType -eq “AzureAD”}

  • This will return all Joined devices. Might be too big a list.

Add-AzureADDeviceRegisteredOwner -ObjectId deviceObjectId -RefObjectId userObjectId

  • Add the user first, where deviceObjectId is the device and userObjectId is the new owner

Remove-AzureADDeviceRegisteredOwner -ObjectId deviceObjectId -OwnerId previousUserObjectId

  • Removes the previous owner where deviceObjectId is the device and previousUserObjectId is the previous owner

Get-AzureADDeviceRegisteredOwner -ObjectId deviceObjectId

  • Confirms change

Plex, Channels and trying to get the two to work together

For a while now I’ve been running Plex as my primary media server. I’ve been trying to use the Plex DVR, but found it to be very finicky. Mostly, it would fail to record shows without telling me in any way. I’d review my upcoming recordings and then check them a couple of days after and they just weren’t there. No notice, nothing. I’ve also been using the Channels app on the AppleTV for live TV. Part of my frustration with PlexDVR is that the channel tuning was always slow. I think if it worked well otherwise I probably would have stuck with it, but that’s not the case. So, I decided to try Channels DVR. What a difference. All I can say is it just seems to work. Everything appears to be getting recorded, channel changes on live TV are fast, it’s really been an excellent experience. I had one issue that I was able to overcome, which is how to get the Channels recordings into Plex in an automated way. Channels DVR has a means of managing recordings and will tag commercials with chapter markers, but that’s just in the Channels DVR app.

I have Channels DVR running in a Docker in Unraid. Probably not necessary, but it’s handy. It was super simple to install. The problem is that Channels DVR wants to record everything to a “TV” folder within the directory you set it to for the recordings. In my case, I have a couple of Unraid user shares related to TV. I have the main TV shows storage at /mnt/user/TVShows and I have the recordings directory at /mnt/user/LiveTV. This means the Channels DVR recordings will go into /mnt/user/LiveTV/TV/showname.

The fix ended up being pretty simple. I run Plex on a Ubuntu server. Here’s my fstab:

// /mnt/DVDs cifs guest,uid=1000,iocharset=utf8 0 0
// /mnt/KidDVDs cifs guest,uid=1000,iocharset=utf8 0 0
// /mnt/Movies cifs guest,uid=1000,iocharset=utf8 0 0
// /mnt/TVShows cifs guest,uid=1000,iocharset=utf8 0 0
// /mnt/Pictures cifs guest,uid=1000,iocharset=utf8 0 0
// /mnt/Music cifs guest,uid=1000,iocharset=utf8 0 0
// /mnt/DVR cifs guest,uid=1000,iocharset=utf8 0 0

Inside Plex I have the TV shows library mapped to both /mnt/TVShows and /mnt/DVR. Plex’s autodiscovery scans both folders just fine and coalesces the shows from both locations. I still need to figure out the comskip, but hitting the jump button is fine for now. In retrospect, I probably could have simply pointed it at TVShows and let it create a new directory in there, but this way keeps the folder structures a little cleaner.

Nutanix CE challenges

The Nutanix install has been moving along.  I would not say it’s ready for more than lab use, but it’s getting there.  I’m setting up a 3 node cluster, and one of the nodes, which has an Intel motherboard, kept throwing a generic error about not being able to find the sysinfo.  Thanks to the help from the forum, I was able to hard code a product name in order to get past the install.  I don’t think it will have an impact on operation, only install, but it’s one of those little things that crops up with new software.

The link is here, if you’re able to access it:


Nutanix in the house

About 2 months ago released a free software only version of their magic, called Community Edition.  I got on the list for this as quickly as I could, but I haven’t been able to install it until now.  See, I wanted to have an actually cluster, what the call RF2 (Redundancy Factor), which would require me to blow away my existing XenServer install to get to enough compatible hardware.  I also needed to purchase SSD’s for each of the nodes in the cluster.

Well, I’ve done that now.  At the moment, I’m exporting my VM’s out of XenServer to OVA’s, in the hope I can restore them from that.  If I can’t, well….I’m not sure then.  I may just rebuild everything from scratch.  I’d really like to figure out how to import them, though.

What I’ll have when I’m done is a 3 node RF2 cluster, with the minimum a 240GB SSD, and at least a 500GB HDD in each node.   All 3 nodes are i5’s, of different vintages. Not a lot of space, once you run the Nutanix overhead, but it’ll be enough for my needs.  I’ll post some screenshots and pics once I’m up and running.

Grandstream GXV3610 disassembled

In the interest of completeness I’m posting my pictures here to show what the inside of the GXV3610 looks like. I couldn’t find this anywhere else, so here it is:



My goal was to remove the cable from the backside of the ball and run it through the small hole I had already drilled through the exterior wall for a Cat5 cable. The two sides of the ball unscrew easily enough, but you can see from the pictures that getting the cable out would have been a challenge. The wires coming out of the jacketed cable go to three different plugs. I could have made that work, although the weatherproof grommet at the back would have been a problem. The bigger issue is what the red arrow is pointing at in the second pic. That’s the mic at the front bottom of the camera. Or rather, that pair of wires goes to the back side of the mic, which is thoroughly coated with a white paste of some sort, no doubt for weather proofing. My only real option would have been to snip those wires and resolder them. Nah, that’s ok.

Instead, I went to Home Depot with the mounting ring in hand and found something like this:

Round PVC junction box

The ring does not line up with standard 4″ round electric boxes. However, it’s a perfect match with this junction box. I had to add some caulk and foam backing material to seal the gap, but it’s closed tight now. I’ll snap a picture of the mounted box and post it.

The camera is working great. Good FOV and sharp picture. I have the 720p model, not the full HD.

Logitech 700e security camera disassembly

My 700e security camera failed after a couple years of use.  I got a Grandstream replacement, which I’ll also post about, so I figured it would be good to take the 700e apart and see if I could figure out what went wrong.  Figure it out I did.  And since there’s a lack of documentation and photos for taking the thing apart I thought I’d put it up here:

First, pop the top silver cover off by slotting a screw driver down the side to pop out the tabs:




Once the silver cover is off you need to remove the 6 screws across the top and gently insert a small flat head screwdriver here:


All you’re trying to do with that one is break the seal. After the seal is broken the darker color cover comes right off and you have this:


Bonus points if you can guess what my problem was:


Remove the screw from the metal plate at the ethernet jack end. Carefully pry up the circuit board from that end. There’s also a slot on the plastic end plate that you can use to help it up. Once it’s out you can carefully raise the board up on the angle, although the cables going to the camera board are still attached. Here’s what I found under there:


Yep, that’s white corrosion all of the top of the Ethernet jack, the lower right corner of the board, and all around the edge. Just below the (I think) transformer on the right there’s a bright white spot. That’s actually a pile of corrosion on top of several resistors.

So, there you have it. A disassembled Logitech 700e security camera. I’m going to try an eraser on the corroded bits and see if it wants to come back to life. I’m not optimistic, but I’ll post back if it works.