<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://bridgetownrb.com/" version="2.2.2">Bridgetown</generator><link href="https://blog.mehcoleman.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.mehcoleman.com/" rel="alternate" type="text/html" /><updated>2026-08-09T21:54:12+01:00</updated><id>https://blog.mehcoleman.com/feed.xml</id><title type="html">MEHColeman</title><subtitle>A software developer&apos;s thoughts turned into text.</subtitle><author><name>Mark Coleman</name></author><entry><title type="html">A Kubernetes Walkthrough</title><link href="https://blog.mehcoleman.com/2022/08/28/kubernetes-walkthrough/" rel="alternate" type="text/html" title="A Kubernetes Walkthrough" /><published>2022-08-28T00:00:00+01:00</published><updated>2022-08-28T00:00:00+01:00</updated><id>repo://posts.collection/_posts/2022-08-28-kubernetes-walkthrough.md</id><content type="html" xml:base="https://blog.mehcoleman.com/2022/08/28/kubernetes-walkthrough/">&lt;p&gt;Here are all the notes I need to get me from zero to installation, to deployment, ingress, encryption and monitoring of a service!&lt;/p&gt;

&lt;h2 id=&quot;create-a-cluster&quot;&gt;Create a Cluster&lt;/h2&gt;

&lt;p&gt;You can use various k8s implementations: Minikube or Rancher (with k3s) are good starting points, but check out minikube, k8s, k3s, k0s, microk8s, etc. They each have their useful features (like &lt;code class=&quot;highlighter-rouge&quot;&gt;minikube tunnel&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;minikube ip&lt;/code&gt; or &lt;code class=&quot;highlighter-rouge&quot;&gt;traefik&lt;/code&gt;), but are generally compatible with each other.&lt;/p&gt;

&lt;p&gt;To administer your kubernetes service, you must have an administration tool - &lt;code class=&quot;highlighter-rouge&quot;&gt;kubectl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Check your k8s is up and running:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;minikube version
minikube version: v1.18.0
commit: ec61815d60f66a6e4f6353030a40b12362557caa-dirty

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;minikube start
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; minikube v1.18.0 on Ubuntu 18.04 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;amd64&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Using the none driver based on existing profile

X The requested memory allocation of 2200MiB does not leave room &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;system overhead &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;total system memory: 2460MiB&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; You may face stability issues.
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Suggestion: Start minikube with less memory allocated: &lt;span class=&quot;s1&quot;&gt;&apos;minikube start --memory=2200mb&apos;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Starting control plane node minikube &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;cluster minikube
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Restarting existing none bare metal machine &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;minikube&quot;&lt;/span&gt; ...
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; OS release is Ubuntu 18.04.5 LTS
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Preparing Kubernetes v1.20.2 on Docker 19.03.13 ...
  - kubelet.resolv-conf&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/run/systemd/resolve/resolv.conf
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Configuring &lt;span class=&quot;nb&quot;&gt;local &lt;/span&gt;host environment ...
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Verifying Kubernetes components...
  - Using image gcr.io/k8s-minikube/storage-provisioner:v4
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Enabled addons: storage-provisioner, default-storageclass
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Done! kubectl is now configured to use &lt;span class=&quot;s2&quot;&gt;&quot;minikube&quot;&lt;/span&gt; cluster and &lt;span class=&quot;s2&quot;&gt;&quot;default&quot;&lt;/span&gt; namespace by default
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Check that kubectl is installed:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl version
Client Version: version.Info&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;Major:&lt;span class=&quot;s2&quot;&gt;&quot;1&quot;&lt;/span&gt;, Minor:&lt;span class=&quot;s2&quot;&gt;&quot;20&quot;&lt;/span&gt;, GitVersion:&lt;span class=&quot;s2&quot;&gt;&quot;v1.20.4&quot;&lt;/span&gt;, GitCommit:&lt;span class=&quot;s2&quot;&gt;&quot;e87da0bd6e03ec3fea7933c4b5263d151aafd07c&quot;&lt;/span&gt;, GitTreeState:&lt;span class=&quot;s2&quot;&gt;&quot;clean&quot;&lt;/span&gt;, BuildDate:&lt;span class=&quot;s2&quot;&gt;&quot;2021-02-18T16:12:00Z&quot;&lt;/span&gt;, GoVersion:&lt;span class=&quot;s2&quot;&gt;&quot;go1.15.8&quot;&lt;/span&gt;, Compiler:&lt;span class=&quot;s2&quot;&gt;&quot;gc&quot;&lt;/span&gt;, Platform:&lt;span class=&quot;s2&quot;&gt;&quot;linux/amd64&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
Server Version: version.Info&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;Major:&lt;span class=&quot;s2&quot;&gt;&quot;1&quot;&lt;/span&gt;, Minor:&lt;span class=&quot;s2&quot;&gt;&quot;20&quot;&lt;/span&gt;, GitVersion:&lt;span class=&quot;s2&quot;&gt;&quot;v1.20.2&quot;&lt;/span&gt;, GitCommit:&lt;span class=&quot;s2&quot;&gt;&quot;faecb196815e248d3ecfb03c680a4507229c2a56&quot;&lt;/span&gt;, GitTreeState:&lt;span class=&quot;s2&quot;&gt;&quot;clean&quot;&lt;/span&gt;, BuildDate:&lt;span class=&quot;s2&quot;&gt;&quot;2021-01-13T13:20:00Z&quot;&lt;/span&gt;, GoVersion:&lt;span class=&quot;s2&quot;&gt;&quot;go1.15.5&quot;&lt;/span&gt;, Compiler:&lt;span class=&quot;s2&quot;&gt;&quot;gc&quot;&lt;/span&gt;, Platform:&lt;span class=&quot;s2&quot;&gt;&quot;linux/amd64&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Get info about cluster:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl cluster-info
Kubernetes control plane is running at https://10.0.0.6:8443
KubeDNS is running at https://10.0.0.6:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use &lt;span class=&quot;s1&quot;&gt;&apos;kubectl cluster-info dump&apos;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;View node info:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   77s   v1.20.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;deploy-an-app&quot;&gt;Deploy an App&lt;/h2&gt;

&lt;p&gt;Create a deployment with a publicly available docker image:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl create deployment  kubernetes-bootcamp &lt;span class=&quot;nt&quot;&gt;--image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;gcr.io/google-samples/kubernetes-bootcamp:v1
deployment.apps/kubernetes-bootcamp created
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Show deployments:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           68s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Create a proxy that will forward requests into the kubernetes private network:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl proxy
Starting to serve on 127.0.0.1:8001
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can then make simple requests to this proxy, like this:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl http://localhost:8001/version
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;major&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;1&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;minor&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;20&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;gitVersion&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;v1.20.2&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;gitCommit&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;faecb196815e248d3ecfb03c680a4507229c2a56&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;gitTreeState&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;clean&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;buildDate&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;2021-01-13T13:20:00Z&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;goVersion&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;go1.15.5&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;compiler&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;gc&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;platform&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;linux/amd64&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In order to pass more sophisticated messages to one of our managed applications, we need its id:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-57978f5f5d-c4nng   1/1     Running   0          10m

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get pods &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; go-template &lt;span class=&quot;nt&quot;&gt;--template&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;{{range .items}}{{.metadata.name}}{{&quot;\n&quot;}}{{end}}&apos;&lt;/span&gt;
kubernetes-bootcamp-57978f5f5d-c4nng

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;POD_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;kubectl get pods &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; go-template &lt;span class=&quot;nt&quot;&gt;--template&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;{{range .items}}{{.metadata.name}}{{&quot;\n&quot;}}{{end}}&apos;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then we can send messages to this pod:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl http://localhost:8001/api/v1/namespaces/default/pods/&lt;span class=&quot;nv&quot;&gt;$POD_NAME&lt;/span&gt;/proxy
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-c8m9c | &lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can also message the proxy api directly:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl http://localhost:8001/api/v1/namespaces/default/pods/&lt;span class=&quot;nv&quot;&gt;$POD_NAME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This requests shows you the full pod configuration:&lt;/p&gt;
&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kind&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Pod&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;apiVersion&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;v1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;metadata&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;kubernetes-bootcamp-57978f5f5d-c4nng&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;generateName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;kubernetes-bootcamp-57978f5f5d-&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;namespace&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;uid&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;8fe45ce3-0a35-4149-a6be-2117ee7cbf7f&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;resourceVersion&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;997&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;creationTimestamp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2022-08-24T12:26:29Z&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;labels&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;app&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;kubernetes-bootcamp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;pod-template-hash&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;57978f5f5d&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ownerReferences&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;apiVersion&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;apps/v1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kind&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ReplicaSet&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;kubernetes-bootcamp-57978f5f5d&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;uid&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;b6042aad-5fec-4a22-bca5-e6c562aaf6ab&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;controller&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;blockOwnerDeletion&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;managedFields&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;manager&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;kube-controller-manager&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;operation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Update&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;apiVersion&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;v1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;time&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2022-08-24T12:26:29Z&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;fieldsType&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;FieldsV1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;fieldsV1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:metadata&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:generateName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:labels&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:app&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:pod-template-hash&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{}},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:ownerReferences&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;k:{\&quot;uid\&quot;:\&quot;b6042aad-5fec-4a22-bca5-e6c562aaf6ab\&quot;}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:apiVersion&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:blockOwnerDeletion&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:controller&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:kind&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:uid&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{}}}},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:spec&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:containers&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;k:{\&quot;name\&quot;:\&quot;kubernetes-bootcamp\&quot;}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:image&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:imagePullPolicy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:resources&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:terminationMessagePath&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:terminationMessagePolicy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{}}},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:dnsPolicy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:enableServiceLinks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:restartPolicy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:schedulerName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:securityContext&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:terminationGracePeriodSeconds&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{}}}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;manager&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;kubelet&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;operation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Update&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;apiVersion&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;v1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;time&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2022-08-24T12:26:32Z&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;fieldsType&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;FieldsV1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;fieldsV1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:conditions&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;k:{\&quot;type\&quot;:\&quot;ContainersReady\&quot;}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:lastProbeTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:lastTransitionTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{}},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;k:{\&quot;type\&quot;:\&quot;Initialized\&quot;}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:lastProbeTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:lastTransitionTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{}},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;k:{\&quot;type\&quot;:\&quot;Ready\&quot;}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:lastProbeTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:lastTransitionTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{}}},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:containerStatuses&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:hostIP&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:phase&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:podIP&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:podIPs&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;k:{\&quot;ip\&quot;:\&quot;172.18.0.6\&quot;}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:ip&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{}}},&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;f:startTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:{}}}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;spec&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;volumes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;default-token-9dbv6&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;secret&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;secretName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;default-token-9dbv6&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;defaultMode&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;420&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;containers&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;kubernetes-bootcamp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;gcr.io/google-samples/kubernetes-bootcamp:v1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;resources&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;volumeMounts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;default-token-9dbv6&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;readOnly&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;mountPath&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/var/run/secrets/kubernetes.io/serviceaccount&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;terminationMessagePath&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/dev/termination-log&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;terminationMessagePolicy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;File&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;imagePullPolicy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;IfNotPresent&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;restartPolicy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Always&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;terminationGracePeriodSeconds&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;dnsPolicy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ClusterFirst&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;serviceAccountName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;serviceAccount&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;nodeName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;minikube&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;securityContext&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;schedulerName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;default-scheduler&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;tolerations&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;node.kubernetes.io/not-ready&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;operator&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Exists&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;effect&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;NoExecute&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;tolerationSeconds&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;node.kubernetes.io/unreachable&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;operator&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Exists&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;effect&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;NoExecute&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;tolerationSeconds&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;priority&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;enableServiceLinks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;preemptionPolicy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;PreemptLowerPriority&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;phase&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Running&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;conditions&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Initialized&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;True&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lastProbeTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lastTransitionTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2022-08-24T12:26:29Z&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Ready&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;True&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lastProbeTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lastTransitionTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2022-08-24T12:26:32Z&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ContainersReady&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;True&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lastProbeTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lastTransitionTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2022-08-24T12:26:32Z&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;PodScheduled&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;True&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lastProbeTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lastTransitionTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2022-08-24T12:26:29Z&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;hostIP&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;10.0.0.8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;podIP&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;172.18.0.6&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;podIPs&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ip&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;172.18.0.6&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;startTime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2022-08-24T12:26:29Z&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;containerStatuses&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;kubernetes-bootcamp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;running&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;startedAt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2022-08-24T12:26:31Z&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;lastState&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;ready&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;restartCount&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;jocatalin/kubernetes-bootcamp:v1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;imageID&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;containerID&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;docker://f47b1cd0383064d111cc112310e3fb3680a0ec7874817cfbac7473b0a6ecb186&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;started&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;qosClass&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;BestEffort&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is the reference that kubernetes checks to ensure that what is actually running is consistent with the configuration that we want to be running. Any differences are automatically rectified by the kubernetes controller.&lt;/p&gt;

&lt;p&gt;You will usually communicate with a pod without creating this proxy, though. Instead, you will create a Service.&lt;/p&gt;

&lt;h2 id=&quot;app-status&quot;&gt;App Status&lt;/h2&gt;

&lt;p&gt;There are a couple of go-to ways to get information about pods, nodes, services, deployments, etc. &lt;code class=&quot;highlighter-rouge&quot;&gt;get&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;describe&lt;/code&gt; work with most objects.&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get nodes

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get nodes
NAME                   STATUS   ROLES                  AGE   VERSION
lima-rancher-desktop   Ready    control-plane,master   11d   v1.24.4+k3s1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Outputting in wide format lets you see more information about objects.&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get nodes &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; wide
NAME                   STATUS   ROLES                  AGE   VERSION        INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION   CONTAINER-RUNTIME
lima-rancher-desktop   Ready    control-plane,master   11d   v1.24.4+k3s1   192.168.1.62   &amp;lt;none&amp;gt;        Alpine Linux v3.16   5.15.57-0-virt   containerd://1.6.6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;describe&lt;/code&gt; gives more detail, and shows recent events that might be useful to know about:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl describe nodes
Name:               lima-rancher-desktop
Roles:              control-plane,master
Labels:             beta.kubernetes.io/arch&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;amd64
                    beta.kubernetes.io/instance-type&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;k3s
                    beta.kubernetes.io/os&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;linux
                    egress.k3s.io/cluster&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true
                    &lt;/span&gt;kubernetes.io/arch&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;amd64
                    kubernetes.io/hostname&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;lima-rancher-desktop
                    kubernetes.io/os&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;linux
                    node-role.kubernetes.io/control-plane&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true
                    &lt;/span&gt;node-role.kubernetes.io/master&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true
                    &lt;/span&gt;node.kubernetes.io/instance-type&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;k3s
Annotations:        alpha.kubernetes.io/provided-node-ip: 192.168.1.62
                    flannel.alpha.coreos.com/backend-data: &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;VNI&quot;&lt;/span&gt;:1,&lt;span class=&quot;s2&quot;&gt;&quot;VtepMAC&quot;&lt;/span&gt;:&lt;span class=&quot;s2&quot;&gt;&quot;9e:dd:b2:30:cf:33&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                    flannel.alpha.coreos.com/backend-type: vxlan
                    flannel.alpha.coreos.com/kube-subnet-manager: &lt;span class=&quot;nb&quot;&gt;true
                    &lt;/span&gt;flannel.alpha.coreos.com/public-ip: 192.168.1.62
                    k3s.io/hostname: lima-rancher-desktop
                    k3s.io/internal-ip: 192.168.1.62
                    k3s.io/node-args:
                      &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;server&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;--https-listen-port&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;6443&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;--flannel-iface&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;rd0&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;--disable&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;traefik&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;--container-runtime-endpoint&quot;&lt;/span&gt;,&lt;span class=&quot;s2&quot;&gt;&quot;/run/k3s/containerd/c...
                    k3s.io/node-config-hash: G4I3ATTKUNLCZ2PTZF77CHL2LW2RZWWPWVR3A32X4RKONERQ6UCA====
                    k3s.io/node-env: {&quot;&lt;/span&gt;K3S_DATA_DIR&lt;span class=&quot;s2&quot;&gt;&quot;:&quot;&lt;/span&gt;/var/lib/rancher/k3s/data/577968fa3d58539cc4265245941b7be688833e6bf5ad7869fa2afe02f15f1cd2&lt;span class=&quot;s2&quot;&gt;&quot;}
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Tue, 23 Aug 2022 18:07:39 +0100
Taints:             &amp;lt;none&amp;gt;
Unschedulable:      false
Lease:
  HolderIdentity:  lima-rancher-desktop
  AcquireTime:     &amp;lt;unset&amp;gt;
  RenewTime:       Sun, 04 Sep 2022 15:43:19 +0100
Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  MemoryPressure   False   Sun, 04 Sep 2022 15:42:39 +0100   Fri, 02 Sep 2022 23:40:25 +0100   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Sun, 04 Sep 2022 15:42:39 +0100   Fri, 02 Sep 2022 23:40:25 +0100   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure      False   Sun, 04 Sep 2022 15:42:39 +0100   Fri, 02 Sep 2022 23:40:25 +0100   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready            True    Sun, 04 Sep 2022 15:42:39 +0100   Sat, 03 Sep 2022 20:04:03 +0100   KubeletReady                 kubelet is posting ready status
Addresses:
  InternalIP:  192.168.1.62
  Hostname:    lima-rancher-desktop
Capacity:
  cpu:                2
  ephemeral-storage:  102625208Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             6091188Ki
  pods:               110
Allocatable:
  cpu:                2
  ephemeral-storage:  99833802265
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             6091188Ki
  pods:               110
System Info:
  Machine ID:                 a54277578e5fd09a29516dc8b2a2a049
  System UUID:                a54277578e5fd09a29516dc8b2a2a049
  Boot ID:                    8ff701c3-731e-4676-8ffe-8322150e7807
  Kernel Version:             5.15.57-0-virt
  OS Image:                   Alpine Linux v3.16
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  containerd://1.6.6
  Kubelet Version:            v1.24.4+k3s1
  Kube-Proxy Version:         v1.24.4+k3s1
PodCIDR:                      10.42.0.0/24
PodCIDRs:                     10.42.0.0/24
ProviderID:                   k3s://lima-rancher-desktop
Non-terminated Pods:          (8 in total)
  Namespace                   Name                                         CPU Requests  CPU Limits  Memory Requests  Memory Limits  Age
  ---------                   ----                                         ------------  ----------  ---------------  -------------  ---
  kube-system                 svclb-lb-blog-98ecb8d3-ggnkv                 0 (0%)        0 (0%)      0 (0%)           0 (0%)         6d3h
  default                     blog-f496555c7-m72qc                         0 (0%)        0 (0%)      0 (0%)           0 (0%)         23h
  default                     blog-f496555c7-f7w7l                         0 (0%)        0 (0%)      0 (0%)           0 (0%)         2d5h
  default                     blog-f496555c7-q7wjt                         0 (0%)        0 (0%)      0 (0%)           0 (0%)         2d5h
  default                     ingress-nginx-controller-6bf7bc7f94-m78b8    100m (5%)     0 (0%)      90Mi (1%)        0 (0%)         19h
  kube-system                 metrics-server-668d979685-6fnj7              100m (5%)     0 (0%)      70Mi (1%)        0 (0%)         11d
  kube-system                 coredns-b96499967-5gtw5                      100m (5%)     0 (0%)      70Mi (1%)        170Mi (2%)     11d
  kube-system                 local-path-provisioner-7b7dc8d6f5-kls56      0 (0%)        0 (0%)      0 (0%)           0 (0%)         11d
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests    Limits
  --------           --------    ------
  cpu                300m (15%)  0 (0%)
  memory             230Mi (3%)  170Mi (2%)
  ephemeral-storage  0 (0%)      0 (0%)
  hugepages-1Gi      0 (0%)      0 (0%)
  hugepages-2Mi      0 (0%)      0 (0%)
Events:              &amp;lt;none&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can use kubectl to examine logs, or inspect the pod environment:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl logs &lt;span class=&quot;nv&quot;&gt;$POD_NAME&lt;/span&gt;
Kubernetes Bootcamp App Started At: 2022-08-24T12:55:49.787Z | Running On:  kubernetes-bootcamp-fb5c67579-c8m9c

Running On: kubernetes-bootcamp-fb5c67579-c8m9c | Total Requests: 1 | App Uptime: 493.64 seconds | Log Time: 2022-08-24T13:04:03.427Z
Running On: kubernetes-bootcamp-fb5c67579-c8m9c | Total Requests: 2 | App Uptime: 539.727 seconds | Log Time: 2022-08-24T13:04:49.514Z


&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl &lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$POD_NAME&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;env
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
&lt;span class=&quot;nv&quot;&gt;HOSTNAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp-fb5c67579-c8m9c
&lt;span class=&quot;nv&quot;&gt;KUBERNETES_PORT_443_TCP_PROTO&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;tcp
&lt;span class=&quot;nv&quot;&gt;KUBERNETES_PORT_443_TCP_PORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;443
&lt;span class=&quot;nv&quot;&gt;KUBERNETES_PORT_443_TCP_ADDR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;10.96.0.1
&lt;span class=&quot;nv&quot;&gt;KUBERNETES_SERVICE_HOST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;10.96.0.1
&lt;span class=&quot;nv&quot;&gt;KUBERNETES_SERVICE_PORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;443
&lt;span class=&quot;nv&quot;&gt;KUBERNETES_SERVICE_PORT_HTTPS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;443
&lt;span class=&quot;nv&quot;&gt;KUBERNETES_PORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;tcp://10.96.0.1:443
&lt;span class=&quot;nv&quot;&gt;KUBERNETES_PORT_443_TCP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;tcp://10.96.0.1:443
&lt;span class=&quot;nv&quot;&gt;NPM_CONFIG_LOGLEVEL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;info
&lt;span class=&quot;nv&quot;&gt;NODE_VERSION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;6.3.1
&lt;span class=&quot;nv&quot;&gt;HOME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/root
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;…or even open a shell:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl &lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ti&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$POD_NAME&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; bash
root@kubernetes-bootcamp-fb5c67579-c8m9c:/#
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also use &lt;code class=&quot;highlighter-rouge&quot;&gt;top&lt;/code&gt; commands to get resource stats:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl top node
NAME                   CPU&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;cores&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;   CPU%   MEMORY&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;bytes&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;   MEMORY%
lima-rancher-desktop   791m         39%    1496Mi          25%
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl top pod
NAME                        CPU&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;cores&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;   MEMORY&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;bytes&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
blog-f496555c7-7fn7z        0m           2Mi
blog-f496555c7-fcc8z        0m           7Mi
blog-f496555c7-whnml        0m           2Mi
cm-acme-http-solver-hkpw6   0m           3Mi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;monitoring&quot;&gt;Monitoring&lt;/h2&gt;
&lt;h3 id=&quot;lens&quot;&gt;Lens&lt;/h3&gt;

&lt;p&gt;Lens is a nice UI tool for viewing and managing k8s clusters.&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; lens
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;prometheus&quot;&gt;Prometheus&lt;/h3&gt;
&lt;p&gt;Prometheus and Grafana are a useful combination for monitoring your cluster. A seperarate note to come on these.. In the meantime, see: &lt;a href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/prometheus.html&quot;&gt;Control plane metrics with Prometheus - Amazon EKS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;file:///Volumes/protected_data_1/Media/YouTube%20Notes/Professional/DevOps/Kubernetes/Jeff_Geerling/20210210-Kubernetes_101&lt;em&gt;-_Episode_10&lt;/em&gt;-_Monitoring_with_Lens_Prometheus_and_Grafana-zW-E8THfvPY.mp4&lt;/p&gt;
&lt;h2 id=&quot;creating-a-service&quot;&gt;Creating a Service&lt;/h2&gt;

&lt;p&gt;A service defines a collection of pods and a policy and IP address by which to access them.
A default kubernetes service is instantiated when the cluster is started:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;S&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;   AGE
kubernetes   ClusterIP   10.96.0.1    &amp;lt;none&amp;gt;        443/TCP   25s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To access this externally, we need the &lt;code class=&quot;highlighter-rouge&quot;&gt;expose&lt;/code&gt; command.&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl expose deployment/kubernetes-bootcamp &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;NodePort&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt; 8080
service/kubernetes-bootcamp exposed

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get services
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;S&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;          AGE
kubernetes            ClusterIP   10.96.0.1        &amp;lt;none&amp;gt;        443/TCP          3m49s
kubernetes-bootcamp   NodePort    10.100.188.108   &amp;lt;none&amp;gt;        8080:31601/TCP   69s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For creating an external web server, you’d want to use a &lt;code class=&quot;highlighter-rouge&quot;&gt;LoadBalancer&lt;/code&gt; type of service. This is usually provided by cloud services, and is not available on minikube. However, k3s comes with &lt;em&gt;traefik&lt;/em&gt; (although I actually prefer to make use of ingress-nginx)
We can then interrogate the service to view its configuration:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
Annotations:              &amp;lt;none&amp;gt;
Selector:                 &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
Type:                     NodePort
IP Families:              &amp;lt;none&amp;gt;
IP:                       10.100.188.108
IPs:                      10.100.188.108
Port:                     &amp;lt;&lt;span class=&quot;nb&quot;&gt;unset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;  8080/TCP
TargetPort:               8080/TCP
NodePort:                 &amp;lt;&lt;span class=&quot;nb&quot;&gt;unset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;  31601/TCP
Endpoints:                172.18.0.2:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   &amp;lt;none&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To parse the specific node port ID, we can use:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get services/kubernetes-bootcamp &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; go-template&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;{{(index .spec.ports 0).nodePort}}&apos;&lt;/span&gt;
31601

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NODE_PORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;kubectl get services/kubernetes-bootcamp &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; go-template&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;{{(index .spec.ports 0).nodePort}}&apos;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NODE_PORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NODE_PORT&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;NODE_PORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;31601
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And to access the application via the service:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;minikube ip&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$NODE_PORT&lt;/span&gt;
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-sfbjd | &lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;labels&quot;&gt;Labels&lt;/h3&gt;

&lt;p&gt;A label will automatically be generated. You can see this with &lt;code class=&quot;highlighter-rouge&quot;&gt;describe deployment&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl describe deployment
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Wed, 24 Aug 2022 16:39:19 +0000
Labels:                 &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
  Containers:
   kubernetes-bootcamp:
    Image:        gcr.io/google-samples/kubernetes-bootcamp:v1
    Port:         8080/TCP
    Host Port:    0/TCP
    Environment:  &amp;lt;none&amp;gt;
    Mounts:       &amp;lt;none&amp;gt;
  Volumes:        &amp;lt;none&amp;gt;
Conditions:
  Type           Status  Reason
  &lt;span class=&quot;nt&quot;&gt;----&lt;/span&gt;           &lt;span class=&quot;nt&quot;&gt;------&lt;/span&gt;  &lt;span class=&quot;nt&quot;&gt;------&lt;/span&gt;
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  &amp;lt;none&amp;gt;
NewReplicaSet:   kubernetes-bootcamp-fb5c67579 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;1/1 replicas created&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Events:
  Type    Reason             Age   From                   Message
  &lt;span class=&quot;nt&quot;&gt;----&lt;/span&gt;    &lt;span class=&quot;nt&quot;&gt;------&lt;/span&gt;             &lt;span class=&quot;nt&quot;&gt;----&lt;/span&gt;  &lt;span class=&quot;nt&quot;&gt;----&lt;/span&gt;                   &lt;span class=&quot;nt&quot;&gt;-------&lt;/span&gt;
  Normal  ScalingReplicaSet  10m   deployment-controller  Scaled up replica &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;kubernetes-bootcamp-fb5c67579 to 1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here you can see that the deployment label is &lt;code class=&quot;highlighter-rouge&quot;&gt;app=kubernetes-bootcamp&lt;/code&gt;
You can use this to view the pods and services of the deployment:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get pods &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
NAME                                  READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-fb5c67579-sfbjd   1/1     Running   0          20m

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get services &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
NAME                  TYPE       CLUSTER-IP       EXTERNAL-IP   PORT&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;S&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;          AGE
kubernetes-bootcamp   NodePort   10.100.188.108   &amp;lt;none&amp;gt;        8080:31601/TCP   18m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can also add new labels to a pod with:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl label pods &lt;span class=&quot;nv&quot;&gt;$POD_NAME&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;v1
pod/kubernetes-bootcamp-fb5c67579-sfbjd labeled
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;deleting-a-service&quot;&gt;Deleting a service&lt;/h3&gt;
&lt;p&gt;You can use a label to delete a service:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl delete service &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
service &lt;span class=&quot;s2&quot;&gt;&quot;kubernetes-bootcamp&quot;&lt;/span&gt; deleted
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The pod and node will continue as before, simply no longer exposed. To shut down the application, you need to also delete the deployment.&lt;/p&gt;

&lt;h1 id=&quot;scaling-kubernetes&quot;&gt;Scaling Kubernetes&lt;/h1&gt;
&lt;p&gt;I’ve split my notes about k8s scaling solutions in two:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;[[Kubernetes Application Scaling]] deals with scaling workloads by creating more pods.&lt;/li&gt;
  &lt;li&gt;[[Kubernetes Load Balancing]] considers exposing those pods in services and load balancing work between them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;deployments&quot;&gt;Deployments&lt;/h1&gt;
&lt;h2 id=&quot;rolling-updates&quot;&gt;Rolling Updates&lt;/h2&gt;

&lt;p&gt;Performing a rolling update is simple: Update the configuration so that a new version of the application image is specified:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;image deployments/kubernetes-bootcamp kubernetes-bootcamp&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;jocatalin/kubernetes-bootcamp:v2
deployment.apps/kubernetes-bootcamp image updated
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once the deployment application is changed, kubernetes will automatically migrate the deployment to match the specification. By default, only 1 image becomes unavailable at any 1 time.&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl rollout status deployments/kubernetes-bootcamp
deployment &lt;span class=&quot;s2&quot;&gt;&quot;kubernetes-bootcamp&quot;&lt;/span&gt; successfully rolled out
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If a deployment fails or has a problem, you can rollback to the last known good state:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl rollout undo deployments/kubernetes-bootcamp
deployment.apps/kubernetes-bootcamp rolled back
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;rollback&quot;&gt;Rollback&lt;/h3&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl rollout &lt;span class=&quot;nb&quot;&gt;history &lt;/span&gt;deployment blog
...

kubectl rollout undo deployment blog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For more sophisticated deployment, check out Argo CD (blog post coming soon).&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-interactive/&quot;&gt;Interactive Tutorial - Creating a Cluster | Kubernetes&lt;/a&gt;&lt;/p&gt;</content><author><name>Mark Coleman</name></author><category term="kubernetes" /></entry><entry><title type="html">Switching Contexts with Kubectx</title><link href="https://blog.mehcoleman.com/2022/06/12/switching-contexts-with-kubectx/" rel="alternate" type="text/html" title="Switching Contexts with Kubectx" /><published>2022-06-12T00:00:00+01:00</published><updated>2022-06-12T00:00:00+01:00</updated><id>repo://posts.collection/_posts/2022-06-12-switching-contexts-with-kubectx.md</id><content type="html" xml:base="https://blog.mehcoleman.com/2022/06/12/switching-contexts-with-kubectx/">&lt;p&gt;&lt;a href=&quot;https://github.com/ahmetb/kubectx&quot;&gt;Kubectx&lt;/a&gt; is a tiny cli shortcut to aid in
k8s management and switching between contexts and namespaces.&lt;/p&gt;

&lt;p&gt;Normally you would control this sort of thing with a more complicated command.
To set the default namespace for the current context, you would use:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl config set-context &lt;span class=&quot;nt&quot;&gt;--current&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--namespace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&amp;lt;namespace&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To return to the default:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;kubectl config set-context &lt;span class=&quot;nt&quot;&gt;--current&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--namespace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The easier-to-remember version is:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;kubectx

kubens               &lt;span class=&quot;c&quot;&gt;# list namespaces&lt;/span&gt;
kubens &amp;lt;namespace&amp;gt;   &lt;span class=&quot;c&quot;&gt;# set default namespace&lt;/span&gt;

kubectx              &lt;span class=&quot;c&quot;&gt;# list contexts&lt;/span&gt;
kubectx &amp;lt;context&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;    &lt;span class=&quot;c&quot;&gt;# set context&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>Mark Coleman</name></author><category term="kubernetes" /></entry><entry><title type="html">Gamifying My Productivity</title><link href="https://blog.mehcoleman.com/2022/06/10/gamifying-my-productivity/" rel="alternate" type="text/html" title="Gamifying My Productivity" /><published>2022-06-10T00:00:00+01:00</published><updated>2022-06-10T00:00:00+01:00</updated><id>repo://posts.collection/_posts/2022-06-10-gamifying-my-productivity.md</id><content type="html" xml:base="https://blog.mehcoleman.com/2022/06/10/gamifying-my-productivity/">&lt;p&gt;I’m trying an experiment to improve my productivity, plus also creating a
cryptocurrency token to play around with. Here’s how the two go together.
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=jBwM-mCLQQo&quot;&gt;This video&lt;/a&gt; popped up in my
youtube recommendations last week. It’s over &lt;strong&gt;5 minutes&lt;/strong&gt; long, so it was
pretty hard to make it all the way through, but it starts with a good reminder
that our world has so many small things vying for our attention, it is sometimes
hard to focus. It’s so easy to get stuck into the comfortable reward cycle of
scrolling through reddit, opening another wikipedia tab, checking the socials,
just one more level on that mobile game…. I’ve even found myself closing the
reddit app only to immediately reflexively open it back up again as my brain
immediately starts searching for the next thing to occupy itself.&lt;/p&gt;

&lt;div class=&quot;pullquote&quot;&gt;
&lt;div class=&quot;quotation&quot;&gt; The problem is that pleasure experienced without prior
requirement for pursuit is terrible for us. &lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;Dr Andrew Huberman&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;All these little ways of injecting dopamine into your brain without any effort
feel great, but they’re terrible if you want to keep being productive. Getting
your dopamine through effort… &lt;em&gt;requires effort&lt;/em&gt;. Why not just skip that bit.
Getting rewards without effort is a difficult habit to break, and ultimately,
self-destructive. And it’s getting easier and easier to do that more and more.&lt;/p&gt;

&lt;p&gt;A great productivity technique is to ensure that your rewards are tied to
achievements. More importantly, it’s a kinda good way to lead your life.
Rewarding yourself &lt;em&gt;after achieving something&lt;/em&gt; through effort is a virtuous
reward cycle in itself. Making that a habit is hard, and there are so many
tempting, easy ways to break it.&lt;/p&gt;

&lt;p&gt;So, how about creating a framework, within which you establish &lt;em&gt;for yourself&lt;/em&gt; a
set of rules that ensure that you recognise both the cost and the value of both
your efforts and your rewards.&lt;/p&gt;

&lt;p&gt;To have a play with these ideas, I’ve come up with a &lt;em&gt;scheme&lt;/em&gt; which I’m trying
out… I give myself points for doing productive or virtuous stuff like working
on my book, going to the gym, working on my side-project, or even getting to
bed early! &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;I can then spend these things on rewards: things that I like
to do, but aren’t a productive use of my time. Instead of feeling guilty about
scrolling through reddit, or watching another episode of &lt;em&gt;It’s Always Sunny&lt;/em&gt; for
the n&lt;sup&gt;th&lt;/sup&gt; time, I can feel happy that I’m doing a fun thing &lt;em&gt;that I
earned&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Sometimes that’s quite a shift of perspective.&lt;/p&gt;

&lt;p class=&quot;callout&quot;&gt;The point is to think about how I spend my time in a fun and engaging way.&lt;/p&gt;

&lt;p&gt;This system is easy to tweak. If I think I’ve been going to McDonald’s too
often, because &lt;em&gt;it’s just around the corner and it’s so convenient&lt;/em&gt;, I can
make it cost more points. If I’d like to spend more time at the gym, and can
reward myself more for going. I’ve also found myself changing my activities in
interesting ways. For example, I might think to myself “Hmm, I’ll still watch
this YouTube video, but if I do sit-ups at the same time, I can earn points
too!” or, “I’ve finished for the evening, &lt;em&gt;but if I do just one more Pomodoro&lt;/em&gt;
on my side project, I’ll have extra for a KFC tomorrow, and its the Big Bucket
Deal on Tuesdays, ooooh….”&lt;/p&gt;

&lt;p&gt;The point is not to turn everything into an activity with a price and start
micromanaging my life, but to create a framework with which I can reflect upon
my lifestyle and think about how I spend my time in a fun and engaging way. So
far, I’m getting a lot out of it.&lt;/p&gt;

&lt;h2 id=&quot;using-the-blockchain-to-become-more-productive&quot;&gt;Using the Blockchain to become more productive&lt;/h2&gt;

&lt;p&gt;Now, to implement my scheme in the real world, I’ve created a Solana fungible
token called &lt;em&gt;Pocket Money&lt;/em&gt; (POCK). I have created two accounts - a &lt;em&gt;bank&lt;/em&gt;
account which I use to pay myself reward points, and an &lt;em&gt;earnings&lt;/em&gt; account where
I keep my points, and spend them on goodies. The tokens zip back and forth
between the two accounts as I keep track of my time. Solana has very cheap and
practically instant transactions, so you can do it as much as you like.&lt;/p&gt;

&lt;p&gt;Solana is a super-fast and easy to use cryptocurrency. It’s had &lt;a href=&quot;https://cointelegraph.com/news/can-solana-become-the-dominant-pos-chain-despite-persistent-outages&quot;&gt;some problems
in it’s journey&lt;/a&gt;,
but it it’s more than adequate &lt;strong&gt;for my use case&lt;/strong&gt;. It’s also very easy to
create your own token. Or, send me a message, and I’ll send you some pocket
money. Or, you could buy some Pocket Money super easily here. Do you need a
trust-less, distributed, open, blockchain network by which to track this stuff?
No. But, t’s fun and nerdy, and I’m loving it. Of course, you could get a bunch
of &lt;a href=&quot;https://smile.amazon.co.uk/Unique-Party-84776-Plastic-Treasure/dp/B07CLFK16T/&quot;&gt;physical coins&lt;/a&gt;)
and keep track that way.&lt;/p&gt;

&lt;h3 id=&quot;think-of-the-children&quot;&gt;Think of the Children&lt;/h3&gt;

&lt;p&gt;As the name of the Token suggests, you could also use
this token with your kids. Mow the lawn: get some Pocket Money; play Minecraft,
spend your Pocket Money. &lt;em&gt;“Oh, you want to &lt;a href=&quot;https://www.reddit.com/r/KidsAreFuckingStupid/comments/ut2vtl/&quot;&gt;skip school and go to the toy
store&lt;/a&gt;? Sorry
you don’t have enough Pocket Money™ for that.”&lt;/em&gt; You know, that sort of
thing.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;It’s not a perfect system, and it would be awful to obsessively live your life
this way, but it’s been an interesting way to reflect upon the worth of my time,
how I spend it, and how I appreciate the good things in my life, and the efforts
I’ve made to receive them. Also, creating a cryptocurrency is fun!&lt;/p&gt;

&lt;p&gt;It’s not for everyone, but if you think it might work for you, I encourage you
give it a go. Should you use it as an employer to micro-incentivise your staff
in some sort of Black Mirror distopian future hellscape? NOOOO STAAAAAHP.&lt;/p&gt;

&lt;p&gt;Cover photo by &lt;a href=&quot;https://unsplash.com/es/@mark_crz?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Mark Cruz&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;I don’t get tired when I need to. I can easily stay up till 4am if I’m engrossed in something, but I will bitterly regret it the next day… &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name>Mark Coleman</name></author><category term="productivity" /><category term="pocket" /><category term="crypto" /></entry><entry><title type="html">Creating a Solana Crypto Token</title><link href="https://blog.mehcoleman.com/2022/06/06/creating-a-solana-crypto-token/" rel="alternate" type="text/html" title="Creating a Solana Crypto Token" /><published>2022-06-06T00:00:00+01:00</published><updated>2022-06-06T00:00:00+01:00</updated><id>repo://posts.collection/_posts/2022-06-06-creating-a-solana-crypto-token.md</id><content type="html" xml:base="https://blog.mehcoleman.com/2022/06/06/creating-a-solana-crypto-token/">&lt;p&gt;Solana is a fast, proof-of-history token framework with a Rust language ‘contract’ system.&lt;/p&gt;

&lt;p&gt;I created a couple of Solana tokens. Here’s how…
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Download Solana platform and the SPL CLI:&lt;/p&gt;

    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;sh -c &quot;$(curl -sSfL https://release.solana.com/v1.10.23/install)&quot;&lt;/code&gt;
 (See the &lt;a href=&quot;https://docs.solana.com/cli/install-solana-cli-tools&quot;&gt;Solana Installations Docs&lt;/a&gt; for details.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Install Rust&lt;/li&gt;
  &lt;li&gt;Install the Solana token CLI (&lt;code class=&quot;highlighter-rouge&quot;&gt;cargo install spl-token-cli&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;Mint a new token&lt;/li&gt;
  &lt;li&gt;Create an icon&lt;/li&gt;
  &lt;li&gt;Register the token on github. (&lt;a href=&quot;https://github.com/solana-labs/token-list#adding-new-token&quot;&gt;Solana token registry&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve made a very lightweight docker image
&lt;a href=&quot;https://github.com/MEHColeman/solana-management&quot;&gt;here&lt;/a&gt; with the appropriate
tools and some helpful scripts for playing around with tokens. You can go
through the token creation process below using this container.&lt;/p&gt;

&lt;h2 id=&quot;creating-a-fungible-solana-token&quot;&gt;Creating a fungible Solana token&lt;/h2&gt;
&lt;p&gt;To do a test run first, switch to a test net:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana config get
&lt;span class=&quot;go&quot;&gt;Config File: /root/.config/solana/cli/config.yml
RPC URL: https://api.mainnet-beta.solana.com
WebSocket URL: wss://api.mainnet-beta.solana.com/ (computed)
Keypair Path: /root/.config/solana/id.json
Commitment: confirmed
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana config &lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--url&lt;/span&gt; https://api.devnet.solana.com
&lt;span class=&quot;go&quot;&gt;Config File: /root/.config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: /root/.config/solana/id.json
Commitment: confirmed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Later, when you want to create real tokens on the mainnet, you can set the RPC
URL back to it’s original value:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana config &lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--url&lt;/span&gt; https://api.mainnet-beta.solana.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Also, create an encryption key pair:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana-keygen new  &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; /root/.config/solana/id.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This will create a new key pair. Make a note of the BIP39 passphrase used,
and the seed phrase. The private key is stored in plaintext, and is thus very
insecure. Don’t leave that plaintext file hanging around, or don’t store
anything of value in this wallet.&lt;/p&gt;

&lt;p&gt;Once you have the passphrase and seedphrase stored, you can regenerate your key
pair at any time with:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana-keygen recover &lt;span class=&quot;nt&quot;&gt;--force&lt;/span&gt; prompt://
&lt;span class=&quot;gp&quot;&gt;&amp;lt;enter the seed phrase&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;&amp;lt;enter the passphrase twice&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;You could also store your keys in a hardware wallet like ledger.&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana-keygen pubkey usb://ledger
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;However, USB passthrough with docker on a Mac is not straightforward, so I’m
not doing that. If you want to, it’s possible, but apparently you need to ditch
docker desktop (which uses Hyperkit, which doesn’t support USB passthrough) and
use a KVM like VirtualBox.&lt;/p&gt;

&lt;p&gt;Anyway, the next step is to ensure that the public key displayed matches your
original public key.&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana address
&lt;span class=&quot;go&quot;&gt;2ASn1atx6oHF4vkyF9vEBBMreJPcaXEiaiFieah9vyZK
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then, send yourself some SOL. You’ll need it to pay for the proceeding
transactions.
On the testnet, you can airdrop yourself some:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana airdrop 1
&lt;span class=&quot;go&quot;&gt;Requesting airdrop of 1 SOL

Signature: 4qGBTAcuo8g728CXE5mmn3447vfhBSzs9EmzKh5p25ZK1P9feJ1j3P8ekmfieXYSbT6A8XusderoPU7ceVfA8oCd

1 SOL
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana balance
&lt;span class=&quot;go&quot;&gt;1 SOL
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So, you received 1 SOL, and the Signature returned refers to the blackchain
transaction ID where your airdrop occured. You can search for this with the
&lt;a href=&quot;https://explorer.solana.com/&quot;&gt;Solana blockchain explorer&lt;/a&gt;. That link points
to the mainnet blockchain, but there is a button on the page to choose testnet
or devnet.&lt;/p&gt;

&lt;p&gt;1 SOL is far more than you need to pay for the transactions and account rents
involved here.&lt;/p&gt;

&lt;p&gt;On the mainnet, you’ll need to buy some on an exchange. I used
&lt;a href=&quot;https://www.coinbase.com&quot;&gt;Coinbase&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can quickly check your account details:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana account 2ASn1atx6oHF4vkyF9vEBBMreJPcaXEiaiFieah9vyZK
&lt;span class=&quot;go&quot;&gt;
Public Key: 2ASn1atx6oHF4vkyF9vEBBMreJPcaXEiaiFieah9vyZK
Balance: 1 SOL
Owner: 11111111111111111111111111111111
Executable: false
Rent Epoch: 321
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now to create a new Solana token! I wanted to create a fungible token with 2
decimal places:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;spl-token create-token &lt;span class=&quot;nt&quot;&gt;--decimals&lt;/span&gt; 2        &lt;span class=&quot;c&quot;&gt;# 9 is default&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Creating token DmSx9d931vZt4HLZ6c4Cyt3ka3EAC2mmeD6JEfgCeQoQ

Signature: 4KLmXg4TPbsp9N1xGgXLFErPDjcipGLsbgNmpgkr6NdM2jjy5TKRJjqZeQJB2NrHyzRjrb9BEHRKKLwXrLhrWHJQ
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This creates the token and reports the token unique identifier. You’ll need that
later. Again, the signature is the ID of the transaction on the blockchain which
created your new token&lt;/p&gt;

&lt;p&gt;Next, create an account for your new token:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;spl-token create-account DmSx9d931vZt4HLZ6c4Cyt3ka3EAC2mmeD6JEfgCeQoQ
&lt;span class=&quot;go&quot;&gt;Creating account EnrMVfUNHMotdNAxjzjPakvPXYRG7xggsE78z6z5U6ps

Signature: L5H13wni3i1sfRWu2qYJSiR46re8PWU8taoCSBBFLWK5fXEB29Gf4YGfK4C3oXRMa2RLvnyamBrQa6Z4iB4paXP
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mint a bunch of tokens, and add them to your new account:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;spl-token mint &amp;lt;token ID&amp;gt; &amp;lt;amount&amp;gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;optional account address]
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;spl-token mint DmSx9d931vZt4HLZ6c4Cyt3ka3EAC2mmeD6JEfgCeQoQ 1000000000000
&lt;span class=&quot;go&quot;&gt;Minting 1000000000000 tokens
  Token: DmSx9d931vZt4HLZ6c4Cyt3ka3EAC2mmeD6JEfgCeQoQ
  Recipient: EnrMVfUNHMotdNAxjzjPakvPXYRG7xggsE78z6z5U6ps

Signature: afM8He5RBtXVLSJhiW3m52YEj7iJc2qvBToxrQBp999p1QdAH2yA7gEySpQTRmK2NTZ7gZABh8QC6hUsmTu8P6r
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Verify the token supply:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;spl-token supply DmSx9d931vZt4HLZ6c4Cyt3ka3EAC2mmeD6JEfgCeQoQ
&lt;span class=&quot;go&quot;&gt;18446744073.709551615
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Note that the amount minted is i) measured in increments of whatever the decimal
value the token has been created with, and ii) a maximum of a u64 bit integer.
So in this case, I had created a token with 9 decimal places. That meant that it
reached the u64 representation limit, and produced just as many tokens as it
could.&lt;/p&gt;

&lt;p&gt;Now, check your balances and account details:&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;spl-token balance DmSx9d931vZt4HLZ6c4Cyt3ka3EAC2mmeD6JEfgCeQoQ
&lt;span class=&quot;go&quot;&gt;18446744073.709551615

&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana balance
&lt;span class=&quot;go&quot;&gt;0.99647912 SOL
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana account DmSx9d931vZt4HLZ6c4Cyt3ka3EAC2mmeD6JEfgCeQoQ
&lt;span class=&quot;go&quot;&gt;
Public Key: DmSx9d931vZt4HLZ6c4Cyt3ka3EAC2mmeD6JEfgCeQoQ
Balance: 0.0014616 SOL
Owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Executable: false
Rent Epoch: 321
Length: 82 (0x52) bytes
0000:   01 00 00 00  68 fa 77 ea  11 06 fd c3  10 ec 82 59   ....h.w........Y
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;0010:   4a 2d e0 a3  50 c0 9b 5d  36 3b e1 d4  87 4b 20 32   J-..P..]6;&lt;/span&gt;...K 2
&lt;span class=&quot;go&quot;&gt;0020:   95 43 6c 1e  ff ff ff ff  ff ff ff ff  09 01 00 00   .Cl.............
0030:   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00   ................
0040:   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00   ................
0050:   00 00                                                ..

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you can transfer your SOL and tokens to other accounts&lt;/p&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;solana transfer &lt;span class=&quot;nt&quot;&gt;--allow-unfunded-recipient&lt;/span&gt; 2ASn1atx6oHF4vkyF9vEBBMreJPcaXEiaiFieah9vyZK 0.15
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;OMG! I now have 0.15 SOL in my account, and am now a god among men!&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;spl-token transfer &amp;lt;options&amp;gt; &amp;lt;token ID&amp;gt; &amp;lt;amount&amp;gt; &amp;lt;recipient address&amp;gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;spl-token transfer &lt;span class=&quot;nt&quot;&gt;--allow-unfunded-recipient&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--fund-recipient&lt;/span&gt; DmSx9d931vZt4HLZ6c4Cyt3ka3EAC2mmeD6JEfgCeQoQ 1000 2ASn1atx6oHF4vkyF9vEBBMreJPcaXEiaiFieah9vyZK
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If the address you want to send tokens to isn’t already funded, you can fund it
as part of the transaction.&lt;/p&gt;

&lt;p&gt;There you go! Now you have SOL and tokens in any account you want. Hooray!&lt;/p&gt;

&lt;p&gt;If you use Ledger, your ledger live software doesn’t currently show Solana tokens. You’ll need to use, say, Solflare. Then authenticate your account by connecting your Ledger device. Solflare can then display the correct token balances!&lt;/p&gt;

&lt;h2 id=&quot;finishing-touches&quot;&gt;Finishing Touches&lt;/h2&gt;
&lt;p&gt;You can register your token, and provide an icon, by
providing some basic details to the (&lt;a href=&quot;https://github.com/solana-labs/token-list#adding-new-token&quot;&gt;Solana token
registry&lt;/a&gt;). Simply
add edit the token list file submit a pull request. The PR should be
automatically closed and merged by a bot within about an hour.&lt;/p&gt;

&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://moralis.io/how-to-create-a-solana-token-in-5-steps/&quot;&gt;How to Create a Solana Token in 5 Steps » Moralis » The Ultimate Web3 Development Platform&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/@Austerity_Sucks/create-and-list-a-solana-token-with-zero-development-9f9aa88717c3&quot;&gt;Create and List a Solana Token in a UI with Zero Development in 5 Minutes&lt;/a&gt;&lt;/p&gt;</content><author><name>Mark Coleman</name></author><category term="solana" /><category term="pocket" /><category term="crypto" /></entry><entry><title type="html">Proxmox Installation Checklist</title><link href="https://blog.mehcoleman.com/2022/05/12/proxmox-installation-checklist/" rel="alternate" type="text/html" title="Proxmox Installation Checklist" /><published>2022-05-12T00:00:00+01:00</published><updated>2022-05-12T00:00:00+01:00</updated><id>repo://posts.collection/_posts/2022-05-12-proxmox-installation-checklist.md</id><content type="html" xml:base="https://blog.mehcoleman.com/2022/05/12/proxmox-installation-checklist/">&lt;p&gt;Here is a short list of things you might want to run through as you are installing
a proxmox server.&lt;/p&gt;

&lt;!--more--&gt;

&lt;ul class=&quot;task-list&quot;&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Make sure you’ve downloaded the latest version of Proxmox.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Have a copy of, or a direct link to, any of the VM ISOs you know you are
about to install.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Add all the hard drives you anticipate using before the install, it’s a bit
easier than adding them later.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Install&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Enable updates:
  Check &lt;a href=&quot;https://pve.proxmox.com/wiki/Package_Repositories&quot;&gt;Package Repositories - Proxmox VE&lt;/a&gt; for details
    &lt;ul&gt;
      &lt;li&gt;go to /etc/apt/sources.list&lt;/li&gt;
      &lt;li&gt;ensure security updates are always enabled&lt;/li&gt;
      &lt;li&gt;you can disable enterprise update if you don’t have a subscription&lt;/li&gt;
      &lt;li&gt;unstable updates are actually pretty good, but don’t use for production
systems. From the above link, the current lines are:
        &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# PVE pve-no-subscription repository provided by proxmox.com,
# NOT recommended for production use
deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;If you don’t have a proxmox subscription, also comment out the line in
&lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/apt/sources.list.d/pve-enterprise.list&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;You can then &lt;code class=&quot;highlighter-rouge&quot;&gt;apt-get update&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;apt dist-upgrade&lt;/code&gt; to ensure
you’ve got the latest updates. If you added the unstable source, you’ll probably
have updates, even if you just installed the latest version of Proxmox.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;If available, ensure IOMMU (or VT-d for intel) is enabled in your BIOS.
Especially if you want GPU passthrough.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Update the &lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/default/grub&lt;/code&gt; file:
    &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#GRUB_CMDLINE_LINUX_DEFAULT=&quot;quiet&quot;
#GRUB_CMDLINE_LINUX_DEFAULT=&quot;quiet intel_iommu=on&quot;
GRUB_CMDLINE_LINUX_DEFAULT=&quot;quiet amd_iommu=on&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;After editing this file, run &lt;code class=&quot;highlighter-rouge&quot;&gt;update-grub&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;then add VFIO modules by editing  &lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/modules&lt;/code&gt;. Add
    &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vfio
vfio_iommu_type1
vfei_pci
vfio_virqfd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;On the GUI, under Datacenter/Storage remove the local-lvm drive. Then, in
the shell:
    &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;lvremove /dev/pve/data
lvresice -l +100%FREE /dev/pve/root
resize2fs /dev/mapper/pve-root
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;On the GUI, Datacenter/Storage -&amp;gt; local. Edit this and ensure that all content types are selected.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Disable the subscription nag:
 edit the &lt;code class=&quot;highlighter-rouge&quot;&gt;/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js&lt;/code&gt;
file and find the text “no valid subscription”. Prepend &lt;code class=&quot;highlighter-rouge&quot;&gt;void{( //&lt;/code&gt; to
&lt;code class=&quot;highlighter-rouge&quot;&gt;Ext.Msg.show&lt;/code&gt;&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Install &lt;code class=&quot;highlighter-rouge&quot;&gt;glances&lt;/code&gt; for killing VMs that don’t have the Qemu agent
installed.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Run &lt;code class=&quot;highlighter-rouge&quot;&gt;dpkg-reconfigure locales&lt;/code&gt; to fix nag messages when using the command
line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;post-vm-installation-checklist&quot;&gt;Post VM Installation Checklist&lt;/h2&gt;
&lt;ul class=&quot;task-list&quot;&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Ensure you can ssh into your VM. (This means both configuring SSH to be
available, and installing ssh keys).&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Run your standard post-installation scripts/ ansible playbooks.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Check best practices for your installed OS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;adding-qemu-guest-agent-to-a-nix-vm&quot;&gt;Adding Qemu-Guest-Agent to a *nix VM&lt;/h1&gt;
&lt;p&gt;To get extra, useful information on Promox, you should ensure that your VM OS
has the qemu-guest-agent tools installed and running.&lt;/p&gt;

&lt;h3 id=&quot;step-1-log-in-using-ssh&quot;&gt;Step 1: Log in using SSH&lt;/h3&gt;

&lt;p&gt;You must be logged in via SSH as sudo or root user. Please read &lt;a href=&quot;https://www.snel.com/support/connect-server-ssh/&quot;&gt;this
article&lt;/a&gt; for instructions if
you don’t know how to connect.&lt;/p&gt;

&lt;h3 id=&quot;step-2-install-qemu-guest-agent&quot;&gt;Step 2: Install qemu guest agent&lt;/h3&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;apt update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;qemu-guest-agent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;step-3-enable-and-start-qemu-agent&quot;&gt;Step 3: Enable and Start Qemu Agent&lt;/h3&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;systemctl &lt;span class=&quot;nb&quot;&gt;enable &lt;/span&gt;qemu-guest-agent
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;systemctl start qemu-guest-agent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;step-4-verify&quot;&gt;Step 4: Verify&lt;/h3&gt;

&lt;p&gt;Verify that the Qemu quest agent is running&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;systemctl status qemu-guest-agent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Probably also add open-vm-tools on Proxmox and open-vm-tools-desktop on your VM.&lt;/p&gt;</content><author><name>Mark Coleman</name></author><category term="proxmox" /></entry><entry><title type="html">Creating Kubernetes YAML</title><link href="https://blog.mehcoleman.com/2022/04/29/creating-kubernetes-yaml/" rel="alternate" type="text/html" title="Creating Kubernetes YAML" /><published>2022-04-29T00:00:00+01:00</published><updated>2022-04-29T00:00:00+01:00</updated><id>repo://posts.collection/_posts/2022-04-29-creating-kubernetes-yaml.md</id><content type="html" xml:base="https://blog.mehcoleman.com/2022/04/29/creating-kubernetes-yaml/">&lt;p&gt;Using &lt;code class=&quot;highlighter-rouge&quot;&gt;--dry-run&lt;/code&gt; is a quick way to create well formed k8s yaml:
&lt;!--more--&gt;&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl create ingress blog &lt;span class=&quot;nt&quot;&gt;--class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;nginx &lt;span class=&quot;nt&quot;&gt;--rule&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;blog.mehcoleman.com/*=blog:80&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--dry-run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;client &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  creationTimestamp: null
  name: blog
spec:
  ingressClassName: nginx
  rules:
  - host: blog.mehcoleman.com
    http:
      paths:
      - backend:
          service:
            name: blog
            port:
              number: 80
        path: /
        pathType: Prefix
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;See &lt;a href=&quot;https://devopscube.com/create-kubernetes-yaml/&quot;&gt;How To Create Kubernetes YAML Manifests
Quickly&lt;/a&gt; for many other
examples, and my post on &lt;a href=&quot;/2021/09/28/kubernetes-config-management/&quot;&gt;K8s configuration management methods&lt;/a&gt; for an overview of how they might
be used.&lt;/p&gt;</content><author><name>Mark Coleman</name></author><category term="kubernetes" /><category term="yaml" /></entry><entry><title type="html">Kubernetes Application Scaling</title><link href="https://blog.mehcoleman.com/2022/04/02/kubernetes-application-scaling/" rel="alternate" type="text/html" title="Kubernetes Application Scaling" /><published>2022-04-02T00:00:00+01:00</published><updated>2022-04-02T00:00:00+01:00</updated><id>repo://posts.collection/_posts/2022-04-02-kubernetes-application-scaling.md</id><content type="html" xml:base="https://blog.mehcoleman.com/2022/04/02/kubernetes-application-scaling/">&lt;p&gt;Here are some thoughts on Kubernetes application scaling, both manual and
autoscaling.&lt;/p&gt;

&lt;p&gt;You can set scaling for a service, to ensure that an appropriate number of pods
are available to fulfil requests. &lt;!--more--&gt;An integrated load balancer is part
of the Service.&lt;/p&gt;

&lt;p&gt;A vanilla deployment starts with 1 pod:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           47s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The scaling replication set can be viewed with:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get rs
NAME                            DESIRED   CURRENT   READY   AGE
kubernetes-bootcamp-fb5c67579   1         1         1       47s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This can be changed with:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl scale deployments/kubernetes-bootcamp &lt;span class=&quot;nt&quot;&gt;--replicas&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;4
deployment.apps/kubernetes-bootcamp scaled
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, extra pods with replica configurations will be created:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   4/4     4            4           21m

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get pods &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; wide
NAME                                  READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-fb5c67579-p4pxk   1/1     Running   0          63s   172.18.0.7   minikube   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;
kubernetes-bootcamp-fb5c67579-q42js   1/1     Running   0          63s   172.18.0.9   minikube   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;
kubernetes-bootcamp-fb5c67579-qzxjl   1/1     Running   0          63s   172.18.0.8   minikube   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;
kubernetes-bootcamp-fb5c67579-rjmz4   1/1     Running   0          21m   172.18.0.2   minikube   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get rs
NAME                            DESIRED   CURRENT   READY   AGE
kubernetes-bootcamp-fb5c67579   4         4         4       21m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Likewise, we can scale down with:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl scale deployments/kubernetes-bootcamp &lt;span class=&quot;nt&quot;&gt;--replicas&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2
deployment.apps/kubernetes-bootcamp scaled
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Scaling events are logged in the deployments event log. See:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl describe deployments/kubernetes-bootcamp
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Wed, 24 Aug 2022 17:40:26 +0000
Labels:                 &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
  Containers:
   kubernetes-bootcamp:
    Image:        gcr.io/google-samples/kubernetes-bootcamp:v1
    Port:         8080/TCP
    Host Port:    0/TCP
    Environment:  &amp;lt;none&amp;gt;
    Mounts:       &amp;lt;none&amp;gt;
  Volumes:        &amp;lt;none&amp;gt;
Conditions:
  Type           Status  Reason
  &lt;span class=&quot;nt&quot;&gt;----&lt;/span&gt;           &lt;span class=&quot;nt&quot;&gt;------&lt;/span&gt;  &lt;span class=&quot;nt&quot;&gt;------&lt;/span&gt;
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  &amp;lt;none&amp;gt;
NewReplicaSet:   kubernetes-bootcamp-fb5c67579 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;2/2 replicas created&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Events:
  Type    Reason             Age    From                   Message
  &lt;span class=&quot;nt&quot;&gt;----&lt;/span&gt;    &lt;span class=&quot;nt&quot;&gt;------&lt;/span&gt;             &lt;span class=&quot;nt&quot;&gt;----&lt;/span&gt;   &lt;span class=&quot;nt&quot;&gt;----&lt;/span&gt;                   &lt;span class=&quot;nt&quot;&gt;-------&lt;/span&gt;
  Normal  ScalingReplicaSet  29m    deployment-controller  Scaled up replica &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;kubernetes-bootcamp-fb5c67579 to 1
  Normal  ScalingReplicaSet  9m23s  deployment-controller  Scaled up replica &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;kubernetes-bootcamp-fb5c67579 to 4
  Normal  ScalingReplicaSet  48s    deployment-controller  Scaled down replica &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;kubernetes-bootcamp-fb5c67579 to 2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can see that the load-balancing is working by making multiple requests to the
application. Below, we view the service information, extract the node port, and
make a request to the service, which is handled by one of the 4 pods.&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
Annotations:              &amp;lt;none&amp;gt;
Selector:                 &lt;span class=&quot;nv&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;kubernetes-bootcamp
Type:                     NodePort
IP Families:              &amp;lt;none&amp;gt;
IP:                       10.108.183.223
IPs:                      10.108.183.223
Port:                     &amp;lt;&lt;span class=&quot;nb&quot;&gt;unset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;  8080/TCP
TargetPort:               8080/TCP
NodePort:                 &amp;lt;&lt;span class=&quot;nb&quot;&gt;unset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;  32555/TCP
Endpoints:                172.18.0.2:8080,172.18.0.7:8080,172.18.0.8:8080 + 1 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   &amp;lt;none&amp;gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NODE_PORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;kubectl get services/kubernetes-bootcamp &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; go-template&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;{{(index .spec.ports 0).nodePort}}&apos;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;NODE_PORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NODE_PORT&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;NODE_PORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;32555
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;minikube ip&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$NODE_PORT&lt;/span&gt;
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-qzxjl | &lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;minikube ip&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$NODE_PORT&lt;/span&gt;
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-qzxjl | &lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;minikube ip&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$NODE_PORT&lt;/span&gt;
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-rjmz4 | &lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;minikube ip&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$NODE_PORT&lt;/span&gt;
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-p4pxk | &lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;minikube ip&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$NODE_PORT&lt;/span&gt;
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-qzxjl | &lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;minikube ip&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$NODE_PORT&lt;/span&gt;
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-qzxjl | &lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;minikube ip&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$NODE_PORT&lt;/span&gt;
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-fb5c67579-qzxjl | &lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;autoscaling&quot;&gt;Autoscaling&lt;/h2&gt;
&lt;p&gt;You can also get kubernetes to autoscale, and more advanced still, use a service
mesh for more sophisticated control.&lt;/p&gt;

&lt;p&gt;To autoscale, you need to be able to monitor your nodes. Check whether metrics
are installed:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl top nodes
NAME                   CPU&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;cores&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;   CPU%   MEMORY&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;bytes&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;   MEMORY%
lima-rancher-desktop   387m         19%    1375Mi          23%
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Yes! Rancher comes with metrics included (See &lt;a href=&quot;https://rancher.com/docs/rke/latest/en/config-options/add-ons/metrics-server/&quot;&gt;Rancher Docs: Metrics
Server&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If you see:&lt;/p&gt;
&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl top nodes
error: Metrics API not availble.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This means that metrics is not installed on your system.&lt;/p&gt;

&lt;p&gt;You can use Helm to install Bitnami’s metrics-server chart. This might require
extra configuration, depending on your deployment platform.&lt;/p&gt;

&lt;p&gt;From &lt;a href=&quot;https://bitnami.com/stack/metrics-server/helm&quot;&gt;Helm Charts to deploy Metrics Server in Kubernetes&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;helm repo add bitnami https://charts.bitnami.com/bitnami
helm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;my-release bitnami/metrics-server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once the metrics server is running, you can create a horizontal pod autoscaler:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl autoscale &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; namespace] deployment blog &lt;span class=&quot;nt&quot;&gt;--min&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1 &lt;span class=&quot;nt&quot;&gt;--max&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;5 &lt;span class=&quot;nt&quot;&gt;--cpu-percent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;75
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;kubectl get hpa &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; namespace] blog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>Mark Coleman</name></author><category term="kubernetes" /></entry><entry><title type="html">Remote Pair Programming</title><link href="https://blog.mehcoleman.com/2022/03/21/remote-pair-programming/" rel="alternate" type="text/html" title="Remote Pair Programming" /><published>2022-03-21T00:00:00+00:00</published><updated>2022-03-21T00:00:00+00:00</updated><id>repo://posts.collection/_posts/2022-03-21-remote-pair-programming.md</id><content type="html" xml:base="https://blog.mehcoleman.com/2022/03/21/remote-pair-programming/">&lt;p&gt;Pair programming is a fantastic way of sharing ideas, training, being productive
and writing high quality code. Remote pair programming can be just as effective.
I love pairing on projects. If you have an interesting open source project
you’re working on, and want to pair on it, hit me up.&lt;/p&gt;

&lt;h2 id=&quot;different-types-of-pair-programming&quot;&gt;Different types of pair programming&lt;/h2&gt;
&lt;p&gt;There are a couple of common approaches to pair programming that I see a lot.
Approaches and the specific details can be heavily dependent on the people
involved, their preferred way of thinking and learning, and their level of
expertise.&lt;/p&gt;

&lt;p&gt;They can be split into categories, either by looking at the interpersonal
management of the work, or by the technical differences in editing source code.&lt;/p&gt;

&lt;p&gt;Firstly, we can look at different methods of managing the workload:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Unstructured. Simply, two people collaborating on solving a problem, without
any particular set of rules about how this should be done.&lt;/li&gt;
  &lt;li&gt;One person is driving the direction of the development “i.e. “We need to write
a test that checks for &lt;em&gt;this&lt;/em&gt;”, the other is at the keyboard, implementing those
directions, i.e. writing the test.
This can be broken down further according to how prescriptive the &lt;em&gt;leader&lt;/em&gt; is.
Do they get right into the details, or are they taking a 10,000 ft approach to
direction?&lt;/li&gt;
  &lt;li&gt;One person is leading the task and at the keyboard. They are describing what
they are doing. The other person could be learning or mentoring. They could also
be taking notes and, from a slightly detached viewpoint, spotting mistakes or
thinking strategically.&lt;/li&gt;
  &lt;li&gt;One person writes the next test. The partner then takes control and writes the
code that gets the test to pass. They then write the next test, and pass back to
the first person to write the code and repeat the loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These approaches are orthogonal to whether you are working remotely or in an
office together.&lt;/p&gt;

&lt;p&gt;We can also look at the technical details two people writing one thing.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Two people sit in front of the same computer together. The keyboard swaps
between them. As they swap, the same files are open in the same editor. So, they
must both use a shared editor and set of keybindings.&lt;/li&gt;
  &lt;li&gt;Two people sit beside each other on their own computers. When they swap they
can use their own preferred editor, key bindings, etc. This is generally more
ergonomically pleasant. The pair will need to synchronise the source files they
have been working on when they swap roles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These technical approaches can also be largely orthogonal to whether you are
pairing remotely. There are some useful tools to screen share, edit files
simultaneously, or sync code seamlessly.&lt;/p&gt;

&lt;p&gt;Many general purpose chat &amp;amp; conference tools have screen-sharing facilities
that are perfectly sufficient. As long as you can communicate effectively and
the screen lag is not terrible, you’ll be fine. For example, &lt;em&gt;Slack&lt;/em&gt; or &lt;em&gt;Zoom&lt;/em&gt;,
along with a lot of git commits and git pulls works fine.&lt;/p&gt;

&lt;p&gt;This technique works fine for me, but some people like a much finer grain of
swapping who is in control than 1 red-green-refactor, or 1 ‘commits-worth’ of
work. If you like to swap who’s controlling the keyboard in the middle of a
sentence, you’ll love &lt;a href=&quot;https://github.com/remotemobprogramming/mob&quot;&gt;mob&lt;/a&gt;. This
allows a group of collaborators to work together on a shared codebase quickly
and with minimal friction. Each collaborator calls &lt;code class=&quot;highlighter-rouge&quot;&gt;mob start&lt;/code&gt; to start sharing
code on a WIP branch. One person works on the code. To hand over, run &lt;code class=&quot;highlighter-rouge&quot;&gt;mob
next&lt;/code&gt;. Once you’re happy you’ve got a ‘commits-worth’ of code, &lt;code class=&quot;highlighter-rouge&quot;&gt;mob commit&lt;/code&gt;
squashes the WIP commits into a single commit and commits onto the current
branch. Then you can do a regular &lt;code class=&quot;highlighter-rouge&quot;&gt;git push&lt;/code&gt; to ensure your remote repo is
current. Eventually, you’ll want &lt;code class=&quot;highlighter-rouge&quot;&gt;mob done&lt;/code&gt; to end your collaboration session.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pop.com&quot;&gt;Pop&lt;/a&gt; is another good looking tool that allows screen sharing,
collaborative drawing and mouse &amp;amp; keyboard control. If you like working on
a closely shared environment (where you have the same editor and keyboard
shortcuts, etc), this works well. If you like the more individual approach, you
can also use this tool as a good screen sharing chat tool with some nice extra
features.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://tuple.app&quot;&gt;Tuple&lt;/a&gt; is a great screen sharing tool for macOS users (a
linux version is in beta). In addition to the ‘standard features, it has nice
additions for helping to diagnose screen share performance to ensure your screen
share quality stays sharp, and integration with OS features (like link sharing
and enabling ‘Do Not Disturb’) that remove friction from a pairing session.&lt;/p&gt;

&lt;p&gt;Pair programming and remote pairing are such a fantastic way to work. The great
thing is that there is no One True Way to do it. Find one that works for you and
your pairing partner.&lt;/p&gt;</content><author><name>Mark Coleman</name></author><category term="software-development" /><category term="pair-programming" /><category term="remote" /><category term="training" /></entry><entry><title type="html">Proxmox: GPU Passthrough</title><link href="https://blog.mehcoleman.com/2022/03/04/proxmox-gpu-passthrough/" rel="alternate" type="text/html" title="Proxmox: GPU Passthrough" /><published>2022-03-04T00:00:00+00:00</published><updated>2022-03-04T00:00:00+00:00</updated><id>repo://posts.collection/_posts/2022-03-04-proxmox-gpu-passthrough.md</id><content type="html" xml:base="https://blog.mehcoleman.com/2022/03/04/proxmox-gpu-passthrough/">&lt;p&gt;This guide: &lt;a href=&quot;https://gareth.com/index.php/2021/03/05/proxmox-pci-passthrough/&quot;&gt;Proxmox PCI-Passthrough –
gareth.com&lt;/a&gt;
has almost everything you need.&lt;/p&gt;

&lt;p&gt;The process is quite straightforward. Ensure that the following modules are
added to your &lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/modules&lt;/code&gt; file on your Proxmox node:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Blacklist the graphics drivers form your Proxmox node, so that the graphics
cards will be available for use:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;echo &quot;blacklist nvidia&quot; &amp;gt;&amp;gt; /etc/modprobe.d/blacklist.conf
echo &quot;blacklist radeon&quot; &amp;gt;&amp;gt; /etc/modprobe.d/blacklist.conf
echo &quot;blacklist nouveau&quot; &amp;gt;&amp;gt; /etc/modprobe.d/blacklist.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Find the ID of the graphics card you wish to pass-through.&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;lspci | grep VGA
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you have multiple graphics cards installed, Check you have the right one.
They might share the same vendor ID if they are the same model. Once you have
the ID, (it will be something like &lt;code class=&quot;highlighter-rouge&quot;&gt;03:00&lt;/code&gt;, get the vendor IDs:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;lspci -n -s 03:00
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Add the resultant IDs to &lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/modprobe.d/vfio.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;options vfio-pci ids=10de:1380,10de:0fbc disable_vga=1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Load the new configs&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;update-initramfs -u
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And restart the server.&lt;/p&gt;

&lt;p&gt;Finally, add the PCI device to the hardware section of your VM.&lt;/p&gt;

&lt;h1 id=&quot;notes&quot;&gt;Notes&lt;/h1&gt;
&lt;p&gt;You need to be aware of the IOMMU groups that each device is
attached to. See &lt;a href=&quot;https://www.youtube.com/watch?v=UgIUPZWBu9c#0&quot;&gt;Intro to IOMMU groups for KVM virtual machines -
YouTube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also, one GPU will be attached to the Proxmox host device, and its ROM will be
written in such a way that it will not work correctly for virtualisation, even
if it appears to be an available option. You will need to patch the ROM (See
&lt;a href=&quot;GPU%20BIOS%20Info.md&quot;&gt;GPU BIOS Info&lt;/a&gt;) if you only have one GPU installed, or
you have several others but also want to use this one.&lt;/p&gt;

&lt;h2 id=&quot;add-usb-devices-too&quot;&gt;Add USB Devices too&lt;/h2&gt;
&lt;p&gt;You might be doing GPU passthrough so that you can drive an OS directly through
your PC connected to a monitor. In this case, you probably want to passthrough
some USB devices (like keyboard, mouse and perhaps bluetooth) too. This is even
easier than GPU passthrough.&lt;/p&gt;

&lt;p&gt;The command &lt;code class=&quot;highlighter-rouge&quot;&gt;lsusb&lt;/code&gt; will help identify usb ports and devices. You may want to
passthrough bluetooth, keyboard and mouse. They will need to be plugged in to
the machine hosting Proxmox as you use the GUI to add them.&lt;/p&gt;

&lt;h2 id=&quot;virtualised-gpus&quot;&gt;Virtualised GPUs&lt;/h2&gt;
&lt;p&gt;You can go one step beyond passthrough GPUs, and virtualise GPUs
to split them across multiple VMs. This is more involved. See
&lt;a href=&quot;https://www.youtube.com/watch?v=cPrOoeMxzu0&quot;&gt;Proxmox vGPU Gaming Tutorial - Share Your GPU With Multiple VMs! -
YouTube&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-amd-reset-bug&quot;&gt;The AMD Reset Bug&lt;/h2&gt;
&lt;p&gt;Many AMD graphics cards have a bug where they cannot be initialised more that
once per power cycle. Since the booting of the Proxmox server counts as the
first initialisation, they fail when trying to passthrough to a VM.
There are some fixes available, for some cards.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;https://www.nicksherlock.com/2020/11/working-around-the-amd-gpu-reset-
bug-on-proxmox/&quot;&gt;Working around the AMD GPU Reset bug
on Proxmox using vendor-reset – Nicholas
Sherlock&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;see-also&quot;&gt;See Also&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://3os.org/infrastructure/proxmox/gpu-passthrough/pgu-passthrough-to-vm/&quot;&gt;GPU Passthrough to VM - 3os&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://manjaro.site/how-to-enable-pci-e-passthrough-on-proxmox-7-1/&quot;&gt;How to Enable PCI-e Passthrough on Proxmox 7.1 - Manjaro dot site&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gareth.com/index.php/2021/03/05/proxmox-pci-passthrough/&quot;&gt;Proxmox PCI-Passthrough – gareth.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/homelab/comments/b5xpua/the_ultimate_beginners_guide_to_gpu_passthrough/&quot;&gt;The Ultimate Beginner’s Guide to GPU Passthrough (Proxmox, Windows 10) : homelab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Mark Coleman</name></author><category term="proxmox" /><category term="machine-learning" /><category term="gpu" /></entry><entry><title type="html">Proxmox: Windows 11 Installation</title><link href="https://blog.mehcoleman.com/2022/02/18/proxmox-windows-11-installation/" rel="alternate" type="text/html" title="Proxmox: Windows 11 Installation" /><published>2022-02-18T00:00:00+00:00</published><updated>2022-02-18T00:00:00+00:00</updated><id>repo://posts.collection/_posts/2022-02-18-proxmox-windows-11-installation.md</id><content type="html" xml:base="https://blog.mehcoleman.com/2022/02/18/proxmox-windows-11-installation/">&lt;p&gt;Here’s how I installed Windows 11 onto Proxmox:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Install Proxmox &amp;gt; 7.0&lt;/li&gt;
  &lt;li&gt;Upload the Windows 11 installation ISO from Microsoft and the latest virtio-win iso from &lt;a href=&quot;https://github.com/virtio-win/virtio-win-pkg-scripts&quot;&gt;GitHub - virtio-win/virtio-win-pkg-scripts: Scripts for packaging virtio-win drivers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Create a new VM. Pay attention to the following configuration settings:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When running through the installation wizard, check the following:&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;In the System&lt;/dt&gt;
  &lt;dd&gt;Make sure the SCSI controller is VirtIO SCSI&lt;/dd&gt;
  &lt;dd&gt;Turn on the Qemu Agent&lt;/dd&gt;
  &lt;dd&gt;Ensure UEFI BIOS is chosen&lt;/dd&gt;
  &lt;dd&gt;Use the same drive location for the primary drive, the EFI disk and the TPM storage&lt;/dd&gt;
  &lt;dd&gt;Add the virtual TPM, ensure it’s version 2.0&lt;/dd&gt;
  &lt;dd&gt;Ensure machine type is Q35&lt;/dd&gt;
  &lt;dt&gt;Hard Disk&lt;/dt&gt;
  &lt;dd&gt;Bus Device: SCSI, I think, VirtIO Block will also work, but slower&lt;/dd&gt;
  &lt;dt&gt;CPU&lt;/dt&gt;
  &lt;dd&gt;CPU type should be Host (to passthrough everything)&lt;/dd&gt;
  &lt;dt&gt;Network&lt;/dt&gt;
  &lt;dd&gt;Model VirtIO&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Once all this is configured, create your lovely new VM, but don’t start it yet:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Next, add the VirtIO disk so that the additional drivers will be available
when installing Windows 11: Go to the VM, Click Hardware, and add a new CD/DVD
ROM. Attach the virtio-win ISO..&lt;/li&gt;
  &lt;li&gt;Now you can boot the virtual machine. It should boot into the installation
wizard.&lt;/li&gt;
  &lt;li&gt;Continue, with a custom install.&lt;/li&gt;
  &lt;li&gt;Eventually, you will given an opportunity to install more drivers. Browse to
the virtio ISO&lt;/li&gt;
  &lt;li&gt;Pick the amd64 folder, w11 folder, and add the SCSI controller.&lt;/li&gt;
  &lt;li&gt;Next, add the network driver too: Pick the NetKVM folder, w11, amd64&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Go through the rest of the installation process, then when complete, run the
driver installation exe on the virtIO iso to install any remaining drivers
required: Open windows explorer, Open the root directory, and install the
extensions.&lt;/p&gt;

    &lt;p&gt;If you have problems it may be because the virtIO developer certificates are not trusted by Windows 11. You will need to manually trust them. Try:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Go into windows settings -&amp;gt; drivers, and manually adding a certificate. There will be at least two different certificates across the range of folders containing drivers.&lt;/li&gt;
      &lt;li&gt;Once you’ve added them both, go to the Drivers panel in system settings and Add Driver.&lt;/li&gt;
      &lt;li&gt;Then choose the &lt;code class=&quot;highlighter-rouge&quot;&gt;browse...&lt;/code&gt; options and check the box to automatically find drivers recursively. All the drivers should then be added, and things should start working correctly.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;If that didn’t help, check &lt;a href=&quot;https://answers.microsoft.com/en-us/windows/forum/all/error-8004e00f-when-trying-to-access-com/782e5a36-d28f-4b35-a53c-f343e456638d&quot;&gt;Error: 8004E00F when trying to access COM+ Applications in - Microsoft Community&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, to make admin easier, you might need to enable SSHing into windows. I
used this so I could update the Nvidia BIOS on my graphics cards.&lt;/p&gt;

&lt;p&gt;You might also want to enable Proxmox GPU Passthrough or Proxmox GPU Virtualisation.&lt;/p&gt;</content><author><name>Mark Coleman</name></author><category term="proxmox" /><category term="windows-11" /><category term="windows" /></entry></feed>