<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kaito Ii</title>
    <description>The latest articles on DEV Community by Kaito Ii (@kaitoii11).</description>
    <link>https://dev.to/kaitoii11</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F48395%2F3128eb27-c516-4f15-a762-246682a16d86.png</url>
      <title>DEV Community: Kaito Ii</title>
      <link>https://dev.to/kaitoii11</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kaitoii11"/>
    <language>en</language>
    <item>
      <title>Monitor Kubernetes Events as Logs with Fluent Bit</title>
      <dc:creator>Kaito Ii</dc:creator>
      <pubDate>Thu, 07 Sep 2023 09:37:45 +0000</pubDate>
      <link>https://dev.to/kaitoii11/monitor-kubernetes-events-as-logs-with-fluent-bit-1c2d</link>
      <guid>https://dev.to/kaitoii11/monitor-kubernetes-events-as-logs-with-fluent-bit-1c2d</guid>
      <description>&lt;p&gt;Kubernetes event is report of an event happening within the cluster. It tracks any changes made to the cluster which is a good piece of information for debugging.&lt;br&gt;
However, the retention time is limited. &lt;/p&gt;
&lt;h2&gt;
  
  
  Fluentbit
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://fluentbit.io/"&gt;Fluent Bit&lt;/a&gt; is a fast and lightweight Telemetry agent. We will be using Kubernetes Events input plugin to process the Kubernetes event as log.&lt;/p&gt;
&lt;h2&gt;
  
  
  Monitor Kubernetes Event
&lt;/h2&gt;

&lt;p&gt;First we will install Fluentbit using &lt;a href="https://helm.sh/"&gt;Helm&lt;/a&gt;. We will assume you already have a Kubernetes cluster handy.&lt;/p&gt;

&lt;p&gt;We will deploy Fluentbit with a minimal configuration as shown below. Save this as &lt;code&gt;values.yaml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;rbac&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;eventsAccess&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;[INPUT]&lt;/span&gt;
        &lt;span class="s"&gt;Name kubernetes_events&lt;/span&gt;
        &lt;span class="s"&gt;Tag k8s_events.*&lt;/span&gt;
        &lt;span class="s"&gt;kube_url https://kubernetes.default.svc&lt;/span&gt;

  &lt;span class="na"&gt;outputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;[OUTPUT]&lt;/span&gt;
        &lt;span class="s"&gt;Name stdout&lt;/span&gt;
        &lt;span class="s"&gt;Match k8s_events.*&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will need &lt;code&gt;rbac.eventsAccess: true&lt;/code&gt; to give Fluentbit access to Kubernetes Event resource. In &lt;code&gt;config.inputs&lt;/code&gt;, we define the input of Fluentbit which will be Kubernetes event in this case. And in &lt;code&gt;config.outputs&lt;/code&gt;, we define where the output of the incoming Kubernetes event goes to.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;helm repo add fluent https://fluent.github.io/helm-charts

&lt;span class="nv"&gt;$ &lt;/span&gt;helm repo update

&lt;span class="nv"&gt;$ &lt;/span&gt;helm upgrade &lt;span class="nt"&gt;--install&lt;/span&gt; fluent-bit fluent/fluent-bit &lt;span class="nt"&gt;-f&lt;/span&gt; values.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's make sure that our Fluentbit is running.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; kubectl get po
NAME               READY   STATUS    RESTARTS        AGE
fluent-bit-4dm2l   1/1     Running   0               27h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We got the fluentbit running so let's create a sample pod to create some Kubernetes events.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl run nginx &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;sleep &lt;/span&gt;1000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if we take a look at the fluent bit log, we can see the events related to nginx pod we just created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl logs ds/fluent-bit
&lt;span class="o"&gt;[&lt;/span&gt;1] k8s_events.&lt;span class="k"&gt;*&lt;/span&gt;: &lt;span class="o"&gt;[[&lt;/span&gt;1694078558.000000000, &lt;span class="o"&gt;{}]&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"metadata"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"nginx.17829379194ff602"&lt;/span&gt;, &lt;span class="s2"&gt;"namespace"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;, &lt;span class="s2"&gt;"uid"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"08314b94-2b02-4485-8a86-65cb07f1b3e1"&lt;/span&gt;, &lt;span class="s2"&gt;"resourceVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"164604"&lt;/span&gt;, &lt;span class="s2"&gt;"creationTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:38Z"&lt;/span&gt;, &lt;span class="s2"&gt;"managedFields"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"manager"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kubelet"&lt;/span&gt;, &lt;span class="s2"&gt;"operation"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Update"&lt;/span&gt;, &lt;span class="s2"&gt;"apiVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;, &lt;span class="s2"&gt;"time"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:38Z"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldsType"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"FieldsV1"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldsV1"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"f:count"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:firstTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:involvedObject"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:lastTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:message"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:reason"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:source"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"f:component"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:host"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}}&lt;/span&gt;, &lt;span class="s2"&gt;"f:type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}}}]}&lt;/span&gt;, &lt;span class="s2"&gt;"involvedObject"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"kind"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Pod"&lt;/span&gt;, &lt;span class="s2"&gt;"namespace"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;, &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"nginx"&lt;/span&gt;, &lt;span class="s2"&gt;"uid"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2efbf9c5-4155-48c1-add6-b8389c202e91"&lt;/span&gt;, &lt;span class="s2"&gt;"apiVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;, &lt;span class="s2"&gt;"resourceVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"164599"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldPath"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"spec.containers{nginx}"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="s2"&gt;"reason"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Pulling"&lt;/span&gt;, &lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Pulling image "&lt;/span&gt;nginx&lt;span class="s2"&gt;""&lt;/span&gt;, &lt;span class="s2"&gt;"source"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"component"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kubelet"&lt;/span&gt;, &lt;span class="s2"&gt;"host"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kind-control-plane"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="s2"&gt;"firstTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:38Z"&lt;/span&gt;, &lt;span class="s2"&gt;"lastTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:38Z"&lt;/span&gt;, &lt;span class="s2"&gt;"count"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;1, &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Normal"&lt;/span&gt;, &lt;span class="s2"&gt;"eventTime"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;nil, &lt;span class="s2"&gt;"reportingComponent"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;, &lt;span class="s2"&gt;"reportingInstance"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;}]&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;0] k8s_events.&lt;span class="k"&gt;*&lt;/span&gt;: &lt;span class="o"&gt;[[&lt;/span&gt;1694078563.000000000, &lt;span class="o"&gt;{}]&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"metadata"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"nginx.1782937a6e3d22e3"&lt;/span&gt;, &lt;span class="s2"&gt;"namespace"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;, &lt;span class="s2"&gt;"uid"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2fe002bc-c1c5-47b5-b057-a0764602893a"&lt;/span&gt;, &lt;span class="s2"&gt;"resourceVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"164611"&lt;/span&gt;, &lt;span class="s2"&gt;"creationTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"managedFields"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"manager"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kubelet"&lt;/span&gt;, &lt;span class="s2"&gt;"operation"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Update"&lt;/span&gt;, &lt;span class="s2"&gt;"apiVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;, &lt;span class="s2"&gt;"time"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldsType"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"FieldsV1"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldsV1"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"f:count"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:firstTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:involvedObject"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:lastTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:message"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:reason"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:source"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"f:component"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:host"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}}&lt;/span&gt;, &lt;span class="s2"&gt;"f:type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}}}]}&lt;/span&gt;, &lt;span class="s2"&gt;"involvedObject"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"kind"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Pod"&lt;/span&gt;, &lt;span class="s2"&gt;"namespace"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;, &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"nginx"&lt;/span&gt;, &lt;span class="s2"&gt;"uid"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2efbf9c5-4155-48c1-add6-b8389c202e91"&lt;/span&gt;, &lt;span class="s2"&gt;"apiVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;, &lt;span class="s2"&gt;"resourceVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"164599"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldPath"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"spec.containers{nginx}"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="s2"&gt;"reason"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Pulled"&lt;/span&gt;, &lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Successfully pulled image "&lt;/span&gt;nginx&lt;span class="s2"&gt;" in 5.71974592s (5.71977817s including waiting)"&lt;/span&gt;, &lt;span class="s2"&gt;"source"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"component"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kubelet"&lt;/span&gt;, &lt;span class="s2"&gt;"host"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kind-control-plane"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="s2"&gt;"firstTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"lastTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"count"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;1, &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Normal"&lt;/span&gt;, &lt;span class="s2"&gt;"eventTime"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;nil, &lt;span class="s2"&gt;"reportingComponent"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;, &lt;span class="s2"&gt;"reportingInstance"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;}]&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;1] k8s_events.&lt;span class="k"&gt;*&lt;/span&gt;: &lt;span class="o"&gt;[[&lt;/span&gt;1694078563.000000000, &lt;span class="o"&gt;{}]&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"metadata"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"nginx.1782937a6ea78c6c"&lt;/span&gt;, &lt;span class="s2"&gt;"namespace"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;, &lt;span class="s2"&gt;"uid"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"0058a999-0966-4b66-84c8-3361622fc7a8"&lt;/span&gt;, &lt;span class="s2"&gt;"resourceVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"164612"&lt;/span&gt;, &lt;span class="s2"&gt;"creationTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"managedFields"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"manager"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kubelet"&lt;/span&gt;, &lt;span class="s2"&gt;"operation"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Update"&lt;/span&gt;, &lt;span class="s2"&gt;"apiVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;, &lt;span class="s2"&gt;"time"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldsType"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"FieldsV1"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldsV1"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"f:count"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:firstTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:involvedObject"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:lastTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:message"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:reason"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:source"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"f:component"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:host"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}}&lt;/span&gt;, &lt;span class="s2"&gt;"f:type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}}}]}&lt;/span&gt;, &lt;span class="s2"&gt;"involvedObject"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"kind"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Pod"&lt;/span&gt;, &lt;span class="s2"&gt;"namespace"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;, &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"nginx"&lt;/span&gt;, &lt;span class="s2"&gt;"uid"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2efbf9c5-4155-48c1-add6-b8389c202e91"&lt;/span&gt;, &lt;span class="s2"&gt;"apiVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;, &lt;span class="s2"&gt;"resourceVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"164599"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldPath"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"spec.containers{nginx}"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="s2"&gt;"reason"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Created"&lt;/span&gt;, &lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Created container nginx"&lt;/span&gt;, &lt;span class="s2"&gt;"source"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"component"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kubelet"&lt;/span&gt;, &lt;span class="s2"&gt;"host"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kind-control-plane"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="s2"&gt;"firstTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"lastTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"count"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;1, &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Normal"&lt;/span&gt;, &lt;span class="s2"&gt;"eventTime"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;nil, &lt;span class="s2"&gt;"reportingComponent"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;, &lt;span class="s2"&gt;"reportingInstance"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;}]&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;2] k8s_events.&lt;span class="k"&gt;*&lt;/span&gt;: &lt;span class="o"&gt;[[&lt;/span&gt;1694078563.000000000, &lt;span class="o"&gt;{}]&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"metadata"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"nginx.1782937a735969d5"&lt;/span&gt;, &lt;span class="s2"&gt;"namespace"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;, &lt;span class="s2"&gt;"uid"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"8830ae74-2f2c-4d5f-92a8-6f48aff7de59"&lt;/span&gt;, &lt;span class="s2"&gt;"resourceVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"164615"&lt;/span&gt;, &lt;span class="s2"&gt;"creationTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"managedFields"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;[{&lt;/span&gt;&lt;span class="s2"&gt;"manager"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kubelet"&lt;/span&gt;, &lt;span class="s2"&gt;"operation"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Update"&lt;/span&gt;, &lt;span class="s2"&gt;"apiVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;, &lt;span class="s2"&gt;"time"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldsType"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"FieldsV1"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldsV1"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"f:count"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:firstTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:involvedObject"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:lastTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:message"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:reason"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:source"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"f:component"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}&lt;/span&gt;, &lt;span class="s2"&gt;"f:host"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}}&lt;/span&gt;, &lt;span class="s2"&gt;"f:type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{}}}]}&lt;/span&gt;, &lt;span class="s2"&gt;"involvedObject"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"kind"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Pod"&lt;/span&gt;, &lt;span class="s2"&gt;"namespace"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;, &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"nginx"&lt;/span&gt;, &lt;span class="s2"&gt;"uid"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2efbf9c5-4155-48c1-add6-b8389c202e91"&lt;/span&gt;, &lt;span class="s2"&gt;"apiVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;, &lt;span class="s2"&gt;"resourceVersion"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"164599"&lt;/span&gt;, &lt;span class="s2"&gt;"fieldPath"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"spec.containers{nginx}"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="s2"&gt;"reason"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Started"&lt;/span&gt;, &lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Started container nginx"&lt;/span&gt;, &lt;span class="s2"&gt;"source"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;{&lt;/span&gt;&lt;span class="s2"&gt;"component"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kubelet"&lt;/span&gt;, &lt;span class="s2"&gt;"host"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"kind-control-plane"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="s2"&gt;"firstTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"lastTimestamp"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2023-09-07T09:22:43Z"&lt;/span&gt;, &lt;span class="s2"&gt;"count"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;1, &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Normal"&lt;/span&gt;, &lt;span class="s2"&gt;"eventTime"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;nil, &lt;span class="s2"&gt;"reportingComponent"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;, &lt;span class="s2"&gt;"reportingInstance"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;}]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we take a look at the Kubernetes event with kubectl, we can see the same event which we saw in the Fluentbit log for long term storage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl get events --field-selector involvedObject.name=nginx                                           [18:31:21]
LAST SEEN   TYPE     REASON      OBJECT      MESSAGE
8m45s       Normal   Scheduled   pod/nginx   Successfully assigned default/nginx to kind-control-plane
8m44s       Normal   Pulling     pod/nginx   Pulling image "nginx"
8m39s       Normal   Pulled      pod/nginx   Successfully pulled image "nginx" in 5.71974592s (5.71977817s including waiting)
8m39s       Normal   Created     pod/nginx   Created container nginx
8m39s       Normal   Started     pod/nginx   Started container nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We tested out the Kubernetes event input plugin with a simple configuration. From here we can customize the fluentbit configuration to send the logs to third party storages outside of Kubernetes cluster .&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/reference/kubernetes-api/cluster-resources/event-v1/"&gt;https://kubernetes.io/docs/reference/kubernetes-api/cluster-resources/event-v1/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.fluentbit.io/manual/pipeline/inputs/kubernetes-events"&gt;https://docs.fluentbit.io/manual/pipeline/inputs/kubernetes-events&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>tutorial</category>
      <category>monitoring</category>
      <category>fluentbit</category>
    </item>
    <item>
      <title>Remote writing your Prometheus metrics to Grafana Cloud</title>
      <dc:creator>Kaito Ii</dc:creator>
      <pubDate>Fri, 18 Mar 2022 04:23:53 +0000</pubDate>
      <link>https://dev.to/kaitoii11/remote-writing-your-prometheus-metrics-to-grafana-cloud-3k24</link>
      <guid>https://dev.to/kaitoii11/remote-writing-your-prometheus-metrics-to-grafana-cloud-3k24</guid>
      <description>&lt;h2&gt;
  
  
  Setup Grafana Cloud
&lt;/h2&gt;

&lt;p&gt;Register to &lt;a href="https://grafana.com/auth/sign-up/create-user?pg=login" rel="noopener noreferrer"&gt;Grafana Cloud&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create API Key for Grafana Cloud
&lt;/h3&gt;

&lt;p&gt;We will create an API Key to allow our local Prometheus to remote write to Grafana Cloud.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27w223crf8lnnbph36rk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27w223crf8lnnbph36rk.png" alt="Grafana Cloud Portal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Head over to your Grafana Cloud Portal and select Send Metrics on Prometheus.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb7g4bisqekdla69pc8q0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb7g4bisqekdla69pc8q0.png" alt="Prometheus Configs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you scroll above, you should see the section for API Key. Click on &lt;code&gt;Generate now&lt;/code&gt; and create an API Key with the Role &lt;code&gt;MetricsPublisher&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy the Prometheus config and save it locally as values.yaml as we will use it to install our Prometheus Helm Chart. The url and username should be unique for every user.&lt;br&gt;
The password in both snippet should be filled with your API key.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Local Setup
&lt;/h2&gt;

&lt;p&gt;I used Rancher Desktop but most of Kubernetes distribution should work similarly. We will deploy Prometheus using &lt;a href="https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack" rel="noopener noreferrer"&gt;kube-prometheus-stack&lt;/a&gt; with Helm.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add Helm repository 
```
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;$ helm repo add prometheus-community &lt;a href="https://prometheus-community.github.io/helm-charts" rel="noopener noreferrer"&gt;https://prometheus-community.github.io/helm-charts&lt;/a&gt;&lt;br&gt;
$ helm repo update&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Before installing Prometheus, we will tweak the values.yaml we created earlier. We will not directly paste the username and password(API Key) to the file. Instead, we will create a secret and reference that from Prometheus Config.


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;$ kubectl create secret generic grafanacloudsecret \ &lt;br&gt;
--from-literal=username= \&lt;br&gt;
--from-literal=password='' &lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Now, edit the values.yaml. Here is the edited version. Notice that the username and password is referencing the secret. Also I have added extra parameter which will attach extra labels to the metrics sent from this local cluster.

```yaml


prometheus:
  prometheusSpec:
    remoteWrite:
    - url: "https://prometheus-prod-10-prod-us-central-0.grafana.net/api/prom/push"
      basicAuth:
          username:
            name: grafanacloudsecret
            key: username
          password:
            name: grafanacloudsecret
            key: password
    replicaExternalLabelName: "__replica__"
    externalLabels: {cluster: "mylocalcluster"}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now, let's install our Prometheus.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ helm install prometheus prometheus-community/kube-prometheus-stack -n prometheus --create-namespace -f values.yaml&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Check the metrics on Grafana Cloud&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Go back to your Grafana Cloud and open the &lt;code&gt;Grafana Cloud Billing/Usage&lt;/code&gt;. If you wait awhile, we should see some metrics being ingested in Grafana Cloud.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4tx7oovk4uieusnws8h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4tx7oovk4uieusnws8h.png" alt="Grafana Cloud Usage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the left pane, Go to Explore. In the Metrics browser, type in &lt;code&gt;container_memory_usage_bytes&lt;/code&gt;. We can see the memory usage in my local Kubernetes cluster. Notice that there is an extra label named cluster: "mylocalcluster" which we added in our values.yaml. This can be used as an identifier for where this data is coming from.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8iltprk5ol75kuo2zj5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8iltprk5ol75kuo2zj5.png" alt="Prometheus metrics"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/kubernetes/prometheus/remote_write_helm_operator/" rel="noopener noreferrer"&gt;https://grafana.com/docs/grafana-cloud/kubernetes/prometheus/remote_write_helm_operator/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack" rel="noopener noreferrer"&gt;https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>monitoring</category>
      <category>kubernetes</category>
      <category>cloudnative</category>
    </item>
    <item>
      <title>WASM workload on AKS</title>
      <dc:creator>Kaito Ii</dc:creator>
      <pubDate>Thu, 21 Oct 2021 13:36:58 +0000</pubDate>
      <link>https://dev.to/kaitoii11/wasm-workload-on-aks-3oap</link>
      <guid>https://dev.to/kaitoii11/wasm-workload-on-aks-3oap</guid>
      <description>&lt;p&gt;Public preview of AKS supporting WASI (WebAssembly System Interface) workload in Kubernetes is out. And I thought I would try it out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/updates/public-preview-aks-support-for-webassembly-system-interface-wasi-workloads/"&gt;https://azure.microsoft.com/en-us/updates/public-preview-aks-support-for-webassembly-system-interface-wasi-workloads/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TOC
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Register WasmNodePoolPreview feature&lt;/li&gt;
&lt;li&gt;Install aks-preview extension&lt;/li&gt;
&lt;li&gt;Add WASM/WASI node pool to AKS cluster&lt;/li&gt;
&lt;li&gt;Run WASM/WASI Workload&lt;/li&gt;
&lt;li&gt;Create my own WASM workload with Rust&lt;/li&gt;
&lt;li&gt;Upload the WASM module to Azure Container Registry&lt;/li&gt;
&lt;li&gt;Deploy my WASM module&lt;/li&gt;
&lt;li&gt;Clean up&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Register WasmNodePoolPreview feature
&lt;/h2&gt;

&lt;p&gt;Register &lt;code&gt;WasmNodePoolPreview&lt;/code&gt; feature flag to your subscription&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;az feature register &lt;span class="nt"&gt;--namespace&lt;/span&gt; &lt;span class="s2"&gt;"Microsoft.ContainerService"&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"WasmNodePoolPreview"&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"/subscriptions/&amp;lt;YOUR SUBSCRIPTION ID&amp;gt;/providers/Microsoft.Features/providers/Microsoft.ContainerService/features/WasmNodePoolPreview"&lt;/span&gt;,
  &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"Microsoft.ContainerService/WasmNodePoolPreview"&lt;/span&gt;,
  &lt;span class="s2"&gt;"properties"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"state"&lt;/span&gt;: &lt;span class="s2"&gt;"Registering"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"Microsoft.Features/providers/features"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;az feature list &lt;span class="nt"&gt;-o&lt;/span&gt; table &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"[?contains(name, 'Microsoft.ContainerService/WasmNodePoolPreview')].{Name:name,State:properties.state}"&lt;/span&gt;
Name                                            State
&lt;span class="nt"&gt;----------------------------------------------&lt;/span&gt;  &lt;span class="nt"&gt;-----------&lt;/span&gt;
Microsoft.ContainerService/WasmNodePoolPreview  Registering

&lt;span class="nv"&gt;$ &lt;/span&gt;az feature list &lt;span class="nt"&gt;-o&lt;/span&gt; table &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"[?contains(name, 'Microsoft.ContainerService/WasmNodePoolPreview')].{Name:name,State:properties.state}"&lt;/span&gt;
Name                                            State
&lt;span class="nt"&gt;----------------------------------------------&lt;/span&gt;  &lt;span class="nt"&gt;----------&lt;/span&gt;
Microsoft.ContainerService/WasmNodePoolPreview  Registered
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install aks-preview extension
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;az extension add &lt;span class="nt"&gt;--name&lt;/span&gt; aks-preview
&lt;span class="nv"&gt;$ &lt;/span&gt;az extension update &lt;span class="nt"&gt;--name&lt;/span&gt; aks-preview
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add WASM/WASI node pool to AKS cluster
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create resource group&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;az group create &lt;span class="nt"&gt;--name&lt;/span&gt; wasmRG &lt;span class="nt"&gt;-l&lt;/span&gt; westus
&lt;span class="c"&gt;# Create AKS cluster&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;az aks create &lt;span class="nt"&gt;--resource-group&lt;/span&gt; wasmRG &lt;span class="nt"&gt;--name&lt;/span&gt; myAKSCluster
&lt;span class="c"&gt;# Add WASM/WASI node pool&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;az aks nodepool add &lt;span class="nt"&gt;--resource-group&lt;/span&gt; wasmRG &lt;span class="nt"&gt;--cluster-name&lt;/span&gt; myAKSCluster &lt;span class="nt"&gt;--name&lt;/span&gt; mywasipool &lt;span class="nt"&gt;--node-count&lt;/span&gt; 1 &lt;span class="nt"&gt;--workload-runtime&lt;/span&gt; wasmwasi
&lt;span class="c"&gt;# Check the workloadRuntime&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;az aks nodepool show &lt;span class="nt"&gt;-g&lt;/span&gt; wasmRG &lt;span class="nt"&gt;--cluster-name&lt;/span&gt; myAKSCluster &lt;span class="nt"&gt;-n&lt;/span&gt; mywasipool | jq &lt;span class="s1"&gt;'.workloadRuntime'&lt;/span&gt;
&lt;span class="s2"&gt;"WasmWasi"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get credential for AKS cluster&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;az aks get-credentials &lt;span class="nt"&gt;-n&lt;/span&gt; myakscluster &lt;span class="nt"&gt;-g&lt;/span&gt; wasmRG

&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get nodes
NAME                                 STATUS   ROLES   AGE   VERSION
aks-mywasipool-11259355-vmss000000   Ready    agent   76m   1.0.0-alpha.1
aks-nodepool1-11259355-vmss000000    Ready    agent   80m   v1.20.9
aks-nodepool1-11259355-vmss000001    Ready    agent   80m   v1.20.9
aks-nodepool1-11259355-vmss000002    Ready    agent   80m   v1.20.9

&lt;span class="c"&gt;# Get labels on node&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get node aks-mywasipool-11259355-vmss000000 &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{.metadata.labels}'&lt;/span&gt; | jq
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"agentpool"&lt;/span&gt;: &lt;span class="s2"&gt;"mywasipool"&lt;/span&gt;,
  &lt;span class="s2"&gt;"beta.kubernetes.io/arch"&lt;/span&gt;: &lt;span class="s2"&gt;"wasm32-wagi"&lt;/span&gt;,
  &lt;span class="s2"&gt;"beta.kubernetes.io/os"&lt;/span&gt;: &lt;span class="s2"&gt;"wasm32-wagi"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.azure.com/agentpool"&lt;/span&gt;: &lt;span class="s2"&gt;"mywasipool"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.azure.com/cluster"&lt;/span&gt;: &lt;span class="s2"&gt;"MC_wasmRG_myAKSCluster_westus"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.azure.com/mode"&lt;/span&gt;: &lt;span class="s2"&gt;"user"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.azure.com/node-image-version"&lt;/span&gt;: &lt;span class="s2"&gt;"AKSUbuntu-1804gen2containerd-2021.10.02"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.azure.com/os-sku"&lt;/span&gt;: &lt;span class="s2"&gt;"Ubuntu"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.azure.com/role"&lt;/span&gt;: &lt;span class="s2"&gt;"agent"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.azure.com/storageprofile"&lt;/span&gt;: &lt;span class="s2"&gt;"managed"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.azure.com/storagetier"&lt;/span&gt;: &lt;span class="s2"&gt;"Premium_LRS"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.io/arch"&lt;/span&gt;: &lt;span class="s2"&gt;"wasm32-wagi"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.io/hostname"&lt;/span&gt;: &lt;span class="s2"&gt;"aks-mywasipool-11259355-vmss000000"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.io/os"&lt;/span&gt;: &lt;span class="s2"&gt;"wasm32-wagi"&lt;/span&gt;,
  &lt;span class="s2"&gt;"kubernetes.io/role"&lt;/span&gt;: &lt;span class="s2"&gt;"agent"&lt;/span&gt;,
  &lt;span class="s2"&gt;"node-role.kubernetes.io/agent"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;,
  &lt;span class="s2"&gt;"storageprofile"&lt;/span&gt;: &lt;span class="s2"&gt;"managed"&lt;/span&gt;,
  &lt;span class="s2"&gt;"storagetier"&lt;/span&gt;: &lt;span class="s2"&gt;"Premium_LRS"&lt;/span&gt;,
  &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"krustlet"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Get Taints defined in node&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get node aks-mywasipool-11259355-vmss000000 &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{.spec.taints}'&lt;/span&gt; | jq
&lt;span class="o"&gt;[&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"effect"&lt;/span&gt;: &lt;span class="s2"&gt;"NoSchedule"&lt;/span&gt;,
    &lt;span class="s2"&gt;"key"&lt;/span&gt;: &lt;span class="s2"&gt;"kubernetes.io/arch"&lt;/span&gt;,
    &lt;span class="s2"&gt;"value"&lt;/span&gt;: &lt;span class="s2"&gt;"wasm32-wagi"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"effect"&lt;/span&gt;: &lt;span class="s2"&gt;"NoExecute"&lt;/span&gt;,
    &lt;span class="s2"&gt;"key"&lt;/span&gt;: &lt;span class="s2"&gt;"kubernetes.io/arch"&lt;/span&gt;,
    &lt;span class="s2"&gt;"value"&lt;/span&gt;: &lt;span class="s2"&gt;"wasm32-wagi"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;label &lt;code&gt;"type": "krustlet"&lt;/code&gt; shows that the node runs krustlet instead of kubelet&lt;/li&gt;
&lt;li&gt;label &lt;code&gt;"kubernetes.io/arch": "wasm32-wagi"&lt;/code&gt; shows the node architecture&lt;/li&gt;
&lt;li&gt;taint on the wasi node pool will only schedule/execute pods with toleration of &lt;code&gt;wasm32-wagi&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Run WASM/WASI Workload
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create the following yaml as &lt;code&gt;wasi-example.yaml&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;nodeSelector will choose the node with certain label (i.e. node with &lt;code&gt;kubernetes.io/arch: wasm32-wagi&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;toleration will tolerate the taint in the node (i.e.  wasm32-wagi NoSchedule and NoExecute)
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;alpha.wagi.krustlet.dev/default-host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.0.0.0:3001"&lt;/span&gt;
    &lt;span class="na"&gt;alpha.wagi.krustlet.dev/modules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-demo-http-example": {"route": "/http-example", "allowed_hosts": ["https://api.brigade.sh"]},&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-demo-hello": {"route": "/hello/..."},&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-demo-error": {"route": "/error"},&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-demo-log": {"route": "/log"},&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-demo-index": {"route": "/"}&lt;/span&gt;
      &lt;span class="s"&gt;}&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;hostNetwork&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;nodeSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kubernetes.io/arch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wasm32-wagi&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webassembly.azurecr.io/krustlet-wagi-demo-http-example:v1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo-http-example&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webassembly.azurecr.io/krustlet-wagi-demo-hello:v1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo-hello&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webassembly.azurecr.io/krustlet-wagi-demo-index:v1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo-index&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webassembly.azurecr.io/krustlet-wagi-demo-error:v1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo-error&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webassembly.azurecr.io/krustlet-wagi-demo-log:v1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo-log&lt;/span&gt;
  &lt;span class="na"&gt;tolerations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node.kubernetes.io/network-unavailable"&lt;/span&gt;
      &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Exists"&lt;/span&gt;
      &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NoSchedule"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kubernetes.io/arch"&lt;/span&gt;
      &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Equal"&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wasm32-wagi"&lt;/span&gt;
      &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NoExecute"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kubernetes.io/arch"&lt;/span&gt;
      &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Equal"&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wasm32-wagi"&lt;/span&gt;
      &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NoSchedule"&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;$ kubectl apply -f wasi-example.yaml&lt;/span&gt;

&lt;span class="s"&gt;$ kubectl get po -o wide&lt;/span&gt;
&lt;span class="s"&gt;NAME                 READY   STATUS       RESTARTS   AGE   IP       NODE                                 NOMINATED NODE   READINESS GATES&lt;/span&gt;
&lt;span class="s"&gt;krustlet-wagi-demo   0/5     Registered   0          78s   &amp;lt;none&amp;gt;   aks-mywasipool-11259355-vmss000000   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;We can see that the pods has been scheduled on wasipool node
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Get Internal IP for WASI Node&lt;/span&gt;
&lt;span class="s"&gt;$ WASINODE_IP=$(kubectl get nodes aks-mywasipool-11259355-vmss000000 -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}')&lt;/span&gt;

&lt;span class="c1"&gt;# Create values.yaml for nginx chart&lt;/span&gt;
&lt;span class="s"&gt;$ cat &amp;lt;&amp;lt; EOF &amp;gt; values.yaml&lt;/span&gt;
&lt;span class="na"&gt;serverBlock&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|-&lt;/span&gt;
  &lt;span class="s"&gt;server {&lt;/span&gt;
    &lt;span class="s"&gt;listen 0.0.0.0:8080;&lt;/span&gt;
    &lt;span class="s"&gt;location / {&lt;/span&gt;
            &lt;span class="s"&gt;proxy_pass http://$WASINODE_IP:3001;&lt;/span&gt;
    &lt;span class="s"&gt;}&lt;/span&gt;
  &lt;span class="s"&gt;}&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

&lt;span class="s"&gt;$ helm repo add bitnami https://charts.bitnami.com/bitnami&lt;/span&gt;
&lt;span class="s"&gt;$ helm repo update&lt;/span&gt;
&lt;span class="s"&gt;$ helm install hello-wasi bitnami/nginx -f values.yaml&lt;/span&gt;

&lt;span class="s"&gt;$ kubectl get service&lt;/span&gt; 
&lt;span class="s"&gt;NAME               TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE&lt;/span&gt;
&lt;span class="s"&gt;hello-wasi-nginx   LoadBalancer   10.0.163.230   40.83.129.0   80:32513/TCP   3m11s&lt;/span&gt;
&lt;span class="s"&gt;kubernetes         ClusterIP      10.0.0.1       &amp;lt;none&amp;gt;        443/TCP        152m&lt;/span&gt;

&lt;span class="c1"&gt;# Get the external ip for the hello-wasi-nginx service&lt;/span&gt;
&lt;span class="s"&gt;$ EXTERNAL_IP=$(kubectl get service hello-wasi-nginx -o jsonpath='{.status.loadBalancer.ingress[].ip}')&lt;/span&gt;

&lt;span class="s"&gt;$ curl $EXTERNAL_IP/hello&lt;/span&gt;
&lt;span class="s"&gt;hello world&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create my own WASM workload with Rust
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prerequisite: Rust, &lt;a href="%5Bhttps://github.com/bytecodealliance/wasmtime%5D(https://github.com/bytecodealliance/wasmtime)"&gt;wasmtime&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Set up the Rust environment
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;aks-wasm&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;aks-wasm
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo init 
&lt;span class="nv"&gt;$ &lt;/span&gt;rustup target add wasm32-wasi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create a simple app for wasm (src/main.rs)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fn main&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    println!&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Content-Type: text/plain&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    println!&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello from wasm!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Build the app and run it locally
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo build &lt;span class="nt"&gt;--release&lt;/span&gt; &lt;span class="nt"&gt;--target&lt;/span&gt; wasm32-wasi
&lt;span class="nv"&gt;$ &lt;/span&gt;wasmtime target/wasm32-wasi/release/aks-wasm.wasm
Content-Type: text/plain

Hello from wasm!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Upload the WASM module to Azure Container Registry
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prerequisite: &lt;a href="%5Bhttps://github.com/engineerd/wasm-to-oci%5D(https://github.com/engineerd/wasm-to-oci)"&gt;wasm-to-oci&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Setup Azure ContainerRegistry
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# You may have to choose a different name for the registry &lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;az acr create &lt;span class="nt"&gt;-n&lt;/span&gt; MyWASMRegistry &lt;span class="nt"&gt;-g&lt;/span&gt; wasmRG &lt;span class="nt"&gt;--sku&lt;/span&gt; Standard

&lt;span class="c"&gt;# login to Azure Container Registry. Make sure Docker is running&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;az acr login &lt;span class="nt"&gt;-n&lt;/span&gt; MyWASMRegistry

&lt;span class="c"&gt;# Enable anonymous pull to allow pulling the WASM module from WASI node&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;az acr update &lt;span class="nt"&gt;--name&lt;/span&gt; myregistry &lt;span class="nt"&gt;--anonymous-pull-enabled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Push the WASM module to Azure Container Registry
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="c"&gt;# Push the WASM module to Azure Container Registry&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;wasm-to-oci push target/wasm32-wasi/release/aks-wasm.wasm mywasmregistry.azurecr.io/mywasm:1.0.0 

&lt;span class="nv"&gt;$ &lt;/span&gt;az acr repository list &lt;span class="nt"&gt;-n&lt;/span&gt; MyWASMRegistry
&lt;span class="o"&gt;[&lt;/span&gt;
  &lt;span class="s2"&gt;"mywasm"&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;# Make sure the WASM module has been uploaded&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;az acr repository show &lt;span class="nt"&gt;-n&lt;/span&gt; MyWASMRegistry &lt;span class="nt"&gt;--image&lt;/span&gt; mywasm:1.0.0                                           &lt;span class="o"&gt;[&lt;/span&gt;18:27:29]
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"changeableAttributes"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"deleteEnabled"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;,
    &lt;span class="s2"&gt;"listEnabled"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;,
    &lt;span class="s2"&gt;"readEnabled"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;,
    &lt;span class="s2"&gt;"writeEnabled"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"createdTime"&lt;/span&gt;: &lt;span class="s2"&gt;"2021-10-21T09:21:15.8964565Z"&lt;/span&gt;,
  &lt;span class="s2"&gt;"digest"&lt;/span&gt;: &lt;span class="s2"&gt;"sha256:3cade5d310ece611b4d87df55c64e4e6d99ae08d052cfaef2e699df56db90fef"&lt;/span&gt;,
  &lt;span class="s2"&gt;"lastUpdateTime"&lt;/span&gt;: &lt;span class="s2"&gt;"2021-10-21T09:21:15.8964565Z"&lt;/span&gt;,
  &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;,
  &lt;span class="s2"&gt;"signed"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deploy my WASM module
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Update &lt;code&gt;wasi-example.yaml&lt;/code&gt; by adding the wasm module we created earlier
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;alpha.wagi.krustlet.dev/default-host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.0.0.0:3001"&lt;/span&gt;
    &lt;span class="na"&gt;alpha.wagi.krustlet.dev/modules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-demo-http-example": {"route": "/http-example", "allowed_hosts": ["https://api.brigade.sh"]},&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-demo-hello": {"route": "/hello/..."},&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-demo-error": {"route": "/error"},&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-demo-log": {"route": "/log"},&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-demo-index": {"route": "/"},&lt;/span&gt;
        &lt;span class="s"&gt;"krustlet-wagi-mywasm": {"route": "/mywasm"}&lt;/span&gt;
      &lt;span class="s"&gt;}&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;hostNetwork&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;nodeSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kubernetes.io/arch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wasm32-wagi&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webassembly.azurecr.io/krustlet-wagi-demo-http-example:v1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo-http-example&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webassembly.azurecr.io/krustlet-wagi-demo-hello:v1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo-hello&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webassembly.azurecr.io/krustlet-wagi-demo-index:v1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo-index&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webassembly.azurecr.io/krustlet-wagi-demo-error:v1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo-error&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webassembly.azurecr.io/krustlet-wagi-demo-log:v1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-demo-log&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mywasmregistry.azurecr.io/mywasm:1.0.0&lt;/span&gt;
      &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;krustlet-wagi-mywasm&lt;/span&gt;
  &lt;span class="na"&gt;tolerations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node.kubernetes.io/network-unavailable"&lt;/span&gt;
      &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Exists"&lt;/span&gt;
      &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NoSchedule"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kubernetes.io/arch"&lt;/span&gt;
      &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Equal"&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wasm32-wagi"&lt;/span&gt;
      &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NoExecute"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kubernetes.io/arch"&lt;/span&gt;
      &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Equal"&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wasm32-wagi"&lt;/span&gt;
      &lt;span class="na"&gt;effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NoSchedule"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Restart the AKS cluster since the WASM module does not get updated for some reason.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Delete current WASM workload&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl delete &lt;span class="nt"&gt;-f&lt;/span&gt; wasi-example.yaml

&lt;span class="c"&gt;# Restart AKS cluster&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;az aks stop &lt;span class="nt"&gt;-n&lt;/span&gt; myakscluster &lt;span class="nt"&gt;-g&lt;/span&gt; wasmRG &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; az aks start &lt;span class="nt"&gt;-n&lt;/span&gt; myakscluster &lt;span class="nt"&gt;-g&lt;/span&gt; wasmRG

&lt;span class="c"&gt;# Redeploy WASM workload&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl applt &lt;span class="nt"&gt;-f&lt;/span&gt; wasi-example.yaml

&lt;span class="nv"&gt;$ EXTERNAL_IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;kubectl get service hello-wasi-nginx &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{.status.loadBalancer.ingress[].ip}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nv"&gt;$EXTERNAL_IP&lt;/span&gt;/mywasm
Hello from wasm!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Clean up
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;$ helm delete hello-wasi&lt;/span&gt;
&lt;span class="s"&gt;$ kubectl delete -f wasi-example.yaml&lt;/span&gt;
&lt;span class="s"&gt;$ az aks nodepool delete --name mywasipool -g wasmRG --cluster-name myakscluster&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/aks/use-wasi-node-pools"&gt;https://docs.microsoft.com/en-us/azure/aks/use-wasi-node-pools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.baeke.info/2021/10/18/trying-out-webassembly-on-azure-kubernetes-service/"&gt;https://blog.baeke.info/2021/10/18/trying-out-webassembly-on-azure-kubernetes-service/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>webassembly</category>
      <category>kubernetes</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>Notes on CRL</title>
      <dc:creator>Kaito Ii</dc:creator>
      <pubDate>Wed, 04 Aug 2021 14:16:48 +0000</pubDate>
      <link>https://dev.to/kaitoii11/notes-on-crl-5797</link>
      <guid>https://dev.to/kaitoii11/notes-on-crl-5797</guid>
      <description>&lt;h1&gt;
  
  
  CRL: Certificate Revocation List
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;a list of revoked certificates published by a CA or a delegated CRL issuer&lt;/li&gt;
&lt;li&gt;a mechanism for canceling client-side certificate&lt;/li&gt;
&lt;li&gt;when issuing a certificate, the CA includes CRL infromation for the certificate in the certificate itself&lt;/li&gt;
&lt;li&gt;may or may not CDP information within the certificate&lt;/li&gt;
&lt;li&gt;the system compares the user's certificate against apporpriate CRL during authentication

&lt;ul&gt;
&lt;li&gt;It determined to be valid, the system caches certificate attributes and applies&lt;/li&gt;
&lt;li&gt;if it determined that certificate is invalid, it cannot contact apporpriate CRL, or if CRL is expired, it denies the user access&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  CDP: CRL Distribution Point
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;location on  an LDAP directory server or Web server where CA publishes CRLs&lt;/li&gt;
&lt;li&gt;the system periodically contacts CDP to get an update of CRL&lt;/li&gt;
&lt;li&gt;the system downloads cRL information from CDP at the interval specified in the CRL, at interval that you specify during CRL configuration, and when manually download the CRL&lt;/li&gt;
&lt;li&gt;Use any of the following methods to notify the system of a certificate's CDO location

&lt;ul&gt;
&lt;li&gt;Specify the CDP in CA certificate

&lt;ul&gt;
&lt;li&gt;location of CDP may be included within the certificaate&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Specify the CDP in client certificate

&lt;ul&gt;
&lt;li&gt;location of CDP may be included within the certificaate&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Require administrator to mannually enter the CDP location

&lt;ul&gt;
&lt;li&gt;if neither CA or client certificate include the CDP llocation, you must manually specify how to download the CRL objecy&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
    </item>
    <item>
      <title>Command to easily maintain rust dependencies with command line</title>
      <dc:creator>Kaito Ii</dc:creator>
      <pubDate>Sun, 21 Mar 2021 04:11:24 +0000</pubDate>
      <link>https://dev.to/kaitoii11/command-to-easily-maintain-rust-dependencies-with-command-line-5fmm</link>
      <guid>https://dev.to/kaitoii11/command-to-easily-maintain-rust-dependencies-with-command-line-5fmm</guid>
      <description>&lt;h1&gt;
  
  
  Cargo edit
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/killercup/cargo-edit"&gt;Cargo edit&lt;/a&gt; extends cargo by adding the following subcommands.&lt;br&gt;
As you can guess by their names, the subcommands modify Cargo.toml from the command line.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cargo add&lt;/li&gt;
&lt;li&gt;cargo rm&lt;/li&gt;
&lt;li&gt;cargo upgrade&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;$ cargo install cargo-edit&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  cargo add
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cargo add image
Updating 'https://github.com/rust-lang/crates.io-index' index
Adding image v0.23.14 to dependencies

$ cat Cargo.toml                                                                                                          [dependencies]
image = "0.23.14"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Add dependencies with a specific version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cargo add image --vers=0.20                                                                                                  Updating 'https://github.com/rust-lang/crates.io-index' index
      Adding image v0.20 to dependencies

 ii@ii-pro  ~/t/r/image   master ⁝ ?
 $ cat Cargo.toml                                                                                                           [dependencies]
image = "0.20"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  cargo upgrade
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cargo upgrade image                                                                                                      
    Updating 'https://github.com/rust-lang/crates.io-index' index
image:
    Upgrading image v0.20 -&amp;gt; v0.23.14
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  cargo rm
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cargo rm image
Removing image from dependencies

$ cat Cargo.toml                                                                                                           
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>rust</category>
    </item>
    <item>
      <title>Deploy Prometheus monitoring stack to Kubernetes with a single Helm Chart</title>
      <dc:creator>Kaito Ii</dc:creator>
      <pubDate>Mon, 01 Mar 2021 09:30:55 +0000</pubDate>
      <link>https://dev.to/kaitoii11/deploy-prometheus-monitoring-stack-to-kubernetes-with-a-single-helm-chart-2fbd</link>
      <guid>https://dev.to/kaitoii11/deploy-prometheus-monitoring-stack-to-kubernetes-with-a-single-helm-chart-2fbd</guid>
      <description>&lt;h2&gt;
  
  
  kube-prometheus-stack
&lt;/h2&gt;

&lt;p&gt;kube-prometheus-stack is a collection of Kubernetes manifests including the follow&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prometheus operator&lt;/li&gt;
&lt;li&gt;Prometheus&lt;/li&gt;
&lt;li&gt;Alertmanager&lt;/li&gt;
&lt;li&gt;Prometheus node-exporter&lt;/li&gt;
&lt;li&gt;Prometheus Adapter&lt;/li&gt;
&lt;li&gt;kube-state-metrics&lt;/li&gt;
&lt;li&gt;Grafana&lt;/li&gt;
&lt;li&gt;pre-configured to collect metrics from all Kubernetes component&lt;/li&gt;
&lt;li&gt;delivers a default set of dashboards and alerting rules&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequiste
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Helm&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts&lt;/span&gt;

&lt;span class="s"&gt;$ kubectl create ns prom&lt;/span&gt;
&lt;span class="s"&gt;$ helm install prometheus prometheus-community/kube-prometheus-stack -n prom&lt;/span&gt;

&lt;span class="s"&gt;$ kubectl get all -n prom&lt;/span&gt;
&lt;span class="s"&gt;NAME                                                         READY   STATUS    RESTARTS   AGE&lt;/span&gt;
&lt;span class="s"&gt;pod/alertmanager-prom-kube-prometheus-stack-alertmanager-0   2/2     Running   0          2m14s&lt;/span&gt;
&lt;span class="s"&gt;pod/prom-grafana-6c578f9954-jd4nc                            2/2     Running   0          2m15s&lt;/span&gt;
&lt;span class="s"&gt;pod/prom-kube-prometheus-stack-operator-598f86d8d7-759tf     1/1     Running   0          2m15s&lt;/span&gt;
&lt;span class="s"&gt;pod/prom-kube-state-metrics-85d7ddf577-bmnzz                 1/1     Running   0          2m15s&lt;/span&gt;
&lt;span class="s"&gt;pod/prom-prometheus-node-exporter-6kf8n                      1/1     Running   0          2m16s&lt;/span&gt;
&lt;span class="s"&gt;pod/prometheus-prom-kube-prometheus-stack-prometheus-0       2/2     Running   1          2m13s&lt;/span&gt;

&lt;span class="s"&gt;NAME                                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE&lt;/span&gt;
&lt;span class="s"&gt;service/alertmanager-operated                     ClusterIP   None             &amp;lt;none&amp;gt;        9093/TCP,9094/TCP,9094/UDP   2m14s&lt;/span&gt;
&lt;span class="s"&gt;service/prom-grafana                              ClusterIP   10.107.46.206    &amp;lt;none&amp;gt;        80/TCP                       2m16s&lt;/span&gt;
&lt;span class="s"&gt;service/prom-kube-prometheus-stack-alertmanager   ClusterIP   10.107.9.211     &amp;lt;none&amp;gt;        9093/TCP                     2m16s&lt;/span&gt;
&lt;span class="s"&gt;service/prom-kube-prometheus-stack-operator       ClusterIP   10.104.10.237    &amp;lt;none&amp;gt;        443/TCP                      2m16s&lt;/span&gt;
&lt;span class="s"&gt;service/prom-kube-prometheus-stack-prometheus     ClusterIP   10.110.117.167   &amp;lt;none&amp;gt;        9090/TCP                     2m16s&lt;/span&gt;
&lt;span class="s"&gt;service/prom-kube-state-metrics                   ClusterIP   10.106.62.213    &amp;lt;none&amp;gt;        8080/TCP                     2m16s&lt;/span&gt;
&lt;span class="s"&gt;service/prom-prometheus-node-exporter             ClusterIP   10.96.109.34     &amp;lt;none&amp;gt;        9100/TCP                     2m16s&lt;/span&gt;
&lt;span class="s"&gt;service/prometheus-operated                       ClusterIP   None             &amp;lt;none&amp;gt;        9090/TCP                     2m13s&lt;/span&gt;

&lt;span class="s"&gt;NAME                                           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE&lt;/span&gt;
&lt;span class="s"&gt;daemonset.apps/prom-prometheus-node-exporter   1         1         1       1            1           &amp;lt;none&amp;gt;          2m16s&lt;/span&gt;

&lt;span class="s"&gt;NAME                                                  READY   UP-TO-DATE   AVAILABLE   AGE&lt;/span&gt;
&lt;span class="s"&gt;deployment.apps/prom-grafana                          1/1     1            1           2m16s&lt;/span&gt;
&lt;span class="s"&gt;deployment.apps/prom-kube-prometheus-stack-operator   1/1     1            1           2m16s&lt;/span&gt;
&lt;span class="s"&gt;deployment.apps/prom-kube-state-metrics               1/1     1            1           2m16s&lt;/span&gt;

&lt;span class="s"&gt;NAME                                                             DESIRED   CURRENT   READY   AGE&lt;/span&gt;
&lt;span class="s"&gt;replicaset.apps/prom-grafana-6c578f9954                          1         1         1       2m16s&lt;/span&gt;
&lt;span class="s"&gt;replicaset.apps/prom-kube-prometheus-stack-operator-598f86d8d7   1         1         1       2m16s&lt;/span&gt;
&lt;span class="s"&gt;replicaset.apps/prom-kube-state-metrics-85d7ddf577               1         1         1       2m16s&lt;/span&gt;

&lt;span class="s"&gt;NAME                                                                    READY   AGE&lt;/span&gt;
&lt;span class="s"&gt;statefulset.apps/alertmanager-prom-kube-prometheus-stack-alertmanager   1/1     2m14s&lt;/span&gt;
&lt;span class="s"&gt;statefulset.apps/prometheus-prom-kube-prometheus-stack-prometheus       1/1     2m13s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Access Prometheus Dashboard
&lt;/h2&gt;

&lt;p&gt;All services are defined as ClusterIP in default configuration. To access, we are going to use port-forward. However we can edit the service or edit the value upon deployment to use NodePort or Ingress.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;$ kubectl port-forward -n prom prometheus-prom-kube-prometheus-stack-prometheus-0 &lt;/span&gt;&lt;span class="m"&gt;9090&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Access Grafana Dashboard
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;default user/password is admin/prom-operator
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;$ kubectl port-forward -n prom prom-grafana-6c578f9954-rjdmk &lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Uninstall
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;$ helm uninstall prom -n prom&lt;/span&gt;

&lt;span class="s"&gt;Remove CRDs&lt;/span&gt;
&lt;span class="s"&gt;$ kubectl delete crd alertmanagerconfigs.monitoring.coreos.com&lt;/span&gt;
&lt;span class="s"&gt;$ kubectl delete crd alertmanagers.monitoring.coreos.com&lt;/span&gt;
&lt;span class="s"&gt;$ kubectl delete crd podmonitors.monitoring.coreos.com&lt;/span&gt;
&lt;span class="s"&gt;$ kubectl delete crd probes.monitoring.coreos.com&lt;/span&gt;
&lt;span class="s"&gt;$ kubectl delete crd prometheuses.monitoring.coreos.com&lt;/span&gt;
&lt;span class="s"&gt;$ kubectl delete crd prometheusrules.monitoring.coreos.com&lt;/span&gt;
&lt;span class="s"&gt;$ kubectl delete crd servicemonitors.monitoring.coreos.com&lt;/span&gt;
&lt;span class="s"&gt;$ kubectl delete crd thanosrulers.monitoring.coreos.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>kubernetes</category>
      <category>monitoring</category>
    </item>
  </channel>
</rss>
