Thursday, October 7, 2021

Graphing Prime Numbers

I enjoy toying with prime numbers and wanted to see how the Java GraphStream library worked.  Here is a short video of the result. 

 

 

Interestingly, it is little fun projects like this that often turn into moments of learning.  While working on some prime number related programs I learned of some tool limits I wasn't aware of before this.

  •  The max radix value for converting numbers to strings is 36.  From some searching, it sounds like that was chosen by being the number of values 0-9 + the 26 case-insensitive values a-z.  I found it odd when numbers I converted starting at radix 37 were identical.
    • Integer.toString(99999, 37)
  •  For a call to: com.google.common.collect.Sets.powerSet( aSet) , the "aSet" set parameter is limited to a max of 30 items.

 

 

I decided to try a variety of layout parameters to look for interesting results.  Here are a few of those results using GraphStream.

 






 Those were interesting but I decided to see if I could integrate different graphing libraries to look for other interesting features, etc.

My first attempt was to try integrating gephi but that didn't go well.   As I looked into other graphing libraries, I noted that many are not maintained.  This took way too much effort due to the version of netbeans libraries that had been used.  I ended up forcing newer versions which are hosted by Apache.  Eventually, I had code that built but no visual graph was produced - I noted some flakiness with one of my displays when trying to run it so I suspect an issue between older code and my display/drivers.  

Next, I decided to try Jgrapht.  This had an initial snag which was the fact that the original package was no longer maintained and wasn't available via maven.  I ended up finding a version that is either a fork or repackaging of it and is available via maven.  Now, things were much less difficult.  It also resulted in very few total dependencies - even after I reworked the code significantly and added in the picocli lib for command line arg handling. I also ended up needing to add in the jgrapht-ext and jgraphx libs to display resulting graphs.

Here are a couple examples from that. The first uses the pre-canned compact tree layout. It took some playing to get something useful to display though. The second graph uses the pre-canned circle layout and that was easy to setup but still not as visually appealing as I desired.



I'll keep looking and trying new settings to see if I can come up with something better but this does work at least.  From a visual graph standpoint, it doesn't scale very well it seems but maybe some tuning is possible.  I got the generation of the primes tuned much better now and could generate 1M primes quickly but trying to graph even 10k primes seems unrealistic / painful.  I'll probably end up terminating the running process before it ever gets to the point of displaying the graph.


[update] I added the ability to export my data into the Graph Modelling Language (GML) format and that is compatible with the yed tool. Yed has much richer layout support that what I have been working with from a Java library integration standpoint.  The downside is that really large datasets are time consuming to visualize.  I'm not sure how long it took for yed to complete this since I took a several hour break.  This was for 10k primes.







Monday, September 27, 2021

From Microk8s to Usernetes - saga began

 I had a desire to work with more of the "rootless" technologies and found Microk8s a bit limiting.  So I started to look around at what else existed and what state of maturity everything was in.  From a maturity level, much of the work is still pretty new but after looking over information on a few projects, I decided to switch over to Usernetes.

If you review the page you will find a few alternatives and some of the various trade-offs.

The main options listed at the time were Kind, Minikube, Usernetes and K3s with experimental support.

My main initial draw to Usernetes is that it is the reference Kubernetes distribution for Rootless mode.


By this point, I had made some attempts to converge some of the various rootless related setup on my system and had broken some things pretty badly at times while trying to workout changes.  I finally just uninstalled Microk8s and started from that point.  

I was hoping I could still get my deployments from Eclipse working (including running my own private registry) and also keep the SpringBoot / ConfigMap integrations working.


Some of the initial challenges to plan for:

  • Microk8s had some features/add-on options you can install which I needed to account for - the major ones being.
    • DNS
    • dashboard
    • Ingress (Nginx)
    • MetalLB
    • Registry 
    • Local Storage
The good news is;
  •  DNS wasn't much of a problem.  
  • I've not gotten to the dashboard yet.  
  • Since I made a conscious choice to avoid Nginx as Ingress in Microk8s - it was less of an issue.  Really, the initial issue was how to avoid the default install of Traefik.  Once I figured that out, things improved a bit.
  • I installed HAProxy/kubernetes-ingress just like I had in Microk8s. I still may need to work out some changes to settings yet - not quite clear yet.
  • MetalLB installed ok - I've still got some items to sort out regarding accessing services from outside the cluster though.
  • Helm3 installed without many issues.
  • I was able to install cert-manager OK.
  • I was able to get the registry installed but  am working through access issues from outside the cluster still.
  • I was able to get my image for ldap up and running with some effort.
  • I was able to get my Postgresql DB up and  running with some effort

Getting my LDAP and Postgresql images running took unexpected time. I made the conscious decision to work with cgroupv2 when I still Microk8s up but once I got the base Usernetes up, I found issues with accessing existing persistent volumes. The workaround for now was to use setfacl to set permissions in a few cases along with some chown / chmod work and some cluster restarts and other random bits which finally worked out.  I've got some more reading to do on cleaner ways to handle this but I got the images running at least.

I am still working out cluster external access to services - before I didn't have much trouble accessing the LDAP, Postgresql, and registry running in the cluster. Now I've got some extra hoops to sort out for external cluster access. It may come down to just needing calls to:

~/sw/usernetes/rootlessctl.sh add-ports

but I'm not 100% sure yet.  I'm still a bit early in the process.  

Also note that, just to different, I did the Usernetes install for CRIO instead of containerd.

    $ ./install.sh --cri=crio

Which may result in some differences too.


As it stands right now though; I seem to be on the right track:

scott@scott-z1:~$  systemctl --user status -T u7s.target
● u7s.target - Usernetes target (all components in the single node)
     Loaded: loaded (/home/scott/.config/systemd/user/u7s.target; enabled; vendor preset: enabled)
     Active: active since Fri 2021-09-24 08:57:08 EDT; 3 days ago

Sep 24 08:57:08 scott-z1 systemd[2398]: Reached target Usernetes target (all components in the single node).
 

My Podman and Docker are both running rootless at the moment as well but I've got various things tied to containerd. I'd like to simply that a bit more.

But as is, the cluster isn't taking up unrealistic resources.  Working to get logging reasonable with Microk8s and trying to simplify down to an IP4 versus dual stack has helped to a large degree.  A number of services generate quite a bit of logging related to the firewall. I've reduced that a little bit but still some work to go.


I'll have to write up some updates when I get the remaining issues smoothed out - hard to make the time with other commitments though.


Wishing you a blessed day!

Scott


[Update 2022/02/02] I've given up on Usernetes / k3s rootless for now.  The reason is only really related to the usermode networking - slirp4netns.  Maybe this will become easier to use over time in larger deployments but for now it seems a bit of hassle to integrate with existing technology, tools and designs.

Monday, July 5, 2021

Microk8s - minor anoyance

I've been working with Microk8s for a little while now and it generally works well. There is one area where it seems to fall short though - and that is in the area of configuration flexibility. 

I've been starting to work with other tools such as Podman, Buildah, Docker and rootless mode.  I've also been investigating various OCI & CRI runtimes - crun, runc, containerd, cri-o.  As part of that, I want to try the various configurations to see the differences myself.  

Kubernetes deprecated Docker as the runtime for versions 1.21+ and will use CRI in the form of containerd.  This is fine but I would also like to work with crun to determine if there are benefits for some use cases.  Most information I've run across indicates that crun requires less memory and tends to support new features first.  In the use case where I would like to run a good number of services on either a single node cluster or very small cluster as part of some research - crun might provide some benefits.  At the moment, It doesn't seem like configuring Microk8s with crun is an option.  Since OCI and CRI tend to promote the fact that alternative runtimes are supported - I'm somewhat surprised that configuring alternatives in Microk8s is either not supported or possibly just difficult.

I've not found a lot of good/detailed "how-to" articles regarding alternative configuration of many of the container/runtime related technologies. Regardless, I found this post indicating Microk8s lacks the ability to handle alternative setups but the post is old enough that something could have changed or at least the underlying reason may have.

This is a good reason to review other options at least.  I'd rather be able to decide certain tradeoffs based on my needs rather than not have the option. With all the flexibility that K8S provides in general, it seems unfortunate that individual "flavors" may limit configurations. I can see defaulting to some specific configurations - that provides a way to reduce initial complexity but removing/invalidating some configurations seems a bit too "embrace and extend" and/or "Either accept the propriety platform or don't use it" attitudish. I'm hoping I am wrong and can eventually find a way to test out some other configurations of interest.


This is eternal life, that they should know you, the only true God, and him whom you sent, Jesus Christ.


Sunday, May 23, 2021

Luxery Vinyl Tile - trimming the master bedroom doorways

I've got the entry into the master bedroom, entry to master bath and entry to lanai to do some sort of final trim out.

 I'll start with the master batch entry since that is looking the most tedious (and was).  I'd hate to estimate how long it took to do the 3 pieces of LVT and add some additional porcelain tile in the bathroom doorway.  

I'm going to leave a 1/4" gap and try to caulk it nicely as a first attempt (but not last caulking attempt).

Here is the additional 2 rows dry fitted in the doorway.
 
I still had some pre-mixed mortar which surprissingly turned out still usable.
 
And I had a mostly full bag of dry grout left was well from the bathroom install.
 
Here I have it mortared in.
 
And now it's grouted.

 

And the last 3 pieces of LVT cut to size and trimmed to have an even edge along the porcelin tile.

 

I bought a tube of Keracaulk.U - Biscuit which on the tube looked like a good match but when used it was WAY to light.  Now I'm trying to figure out what color/type caulk to use in this last seam.  I know some folks recommend grouting it instead but I'm not sure how much expansion I might see with the LVT even though it is glued down. I can always go back and put in a T-moulding if this turns out to be a poor choice.


[edit 2021/5/20] I had ended up finding some gray caulk which matched. Looks better but wish I had filled it a bit higher.

The final result for the bedroom/bathroom transition.



For the entry into the master bedroom, I'm taking the original molding and just adapting it a bit to work better with the LVT.  Originally, the carpet side of it was a vertical of ~ 3/4" which is way too tall - someone would be tripping over it. Here is the before picture.

 

Here is an after picture of running it through the router table with a 45 degree bit. I'm hoping this will reduce the chance of catching a toe on it.  I sanded it up and just need to find some new stain of a similar color.

 
I had to experiment with stains a bit but I think it came out ok.

 
 
[2021/05/21] And the final doorway - to the lanai.  Still thinking on it.

 I laid some of the LVT under it for now but I'm still working out a final plan.
 

I'll probably end up getting a low threshold and maybe something to trim out the outside edge a bit.



Monday, May 17, 2021

Random Recent IT "stuff"

General issues
  • Ubuntu 21.04 upgrade
    • sizing tmpfs - default 36G on my system seems excessive; what was eating up memory/swap the other day
  • Rootless Docker push to Microk8s Registry
    •  Get https://docker-star-cases:32000/v2/: dial tcp: lookup docker-star-cases on <x.y.z.q>:53: server misbehaving
    • What about podman, buildah, etc? 
  • Microk8s 1.21.0 upgrade
    • kubelite - somewhat excessive CPU?
  • DNS
    • Still working out some DNS ideas
  • journal 
    • logging tuning 
  • Routing / firewall tuning

 

Other known challenges

  • sorting out my nvme and ssd partitions and best usage
    •  Careful not to conflict with snap or normal ubuntu upgrades

Potential plans

  • Upgrade to 128G RAM
    • Allow creation of some specific ramdisks to minimize wear on nvme/ssd drives.
  • Upgrade to i9 processor
    • More cores/threads to spread the services over.
  • Commercial or self-built NAS
    • Simplify data management and provide high-speed access to more systems.
  • UI work

In-progress / todo

  • setup bitnami/openldap in Microk8s
    • enable tls / cert rotation
  • some oauth2 related selections
  • App integration with geoserver 
  • Catch-up Graalvm version of services with SpringBoot version

Friday, April 30, 2021

When something splashes in the night

 I'm not sure why but when up in the night and something splashes in the toilet - my wife would prefer to know before experiencing it herself.  It was a relatively small/quiet splash so I know it wasn't anything big.

My wife was able to unhappily identify it as a frog.  Now, I didn't buy the story that it was as big as a dog or cat though. 

On being questioned as to why I didn't wake her at 3am about it - it was because I also asked what she would have said (and I already knew) which was "get rid of it now".  It wasn't doing any real harm (and I'll admit to a smile when I heard her squeal this morning). Now I've constructed a net out of 3/8" copper tube and cheesecloth. 

Our new house guest likes to sit under the seat rim apparently.  On my first capture attempt he was able to squeeze between the net/copper tube and back into the toilet drain.  On 2nd attempt, I left the net in the toilet but he was watching closely and jumped before I could get there.  Not his first rodeo I'm thinking.

I ran some other ideas by my daughter who refuses to comment.  Put some ice in the toilet to slow his metabolism a bit?  If I had some ether, I could put him under like how they do butterfly exhibits and such.  If I had alcohol in the house, I could add a little beer and maybe get it loopy enough to not care.  Not sure why my daughter refuses to comment or contribute ideas.. Sigh.  She just expressed a negative viewpoint when I commented about relocating it to her toilet.  hehehehehehe

 I'll have to update this once I do catch the escape artist.

 

Hope your day is blessed!

Scott

 

 

Saturday, March 27, 2021

Luxery Vinyl plank continued - The master bedroom

I finally broke down and started the flooring project in the master bedroom over spring break. It was overdue but I dreaded it a bit. The glue down flooring might work better long term but I can't say that I enjoy working with the glue.  

Here is the post where I replaced the front room flooring.

 

This is the bedroom entry way when I started to pull up the base moldings.

 

Here is after I got the first bit done.  I still needed to do another row or 2 before I could move the bed over.  The flooring is CoreLUXE Engineered Vinyl Plank from Lumber Liquidators (LL Flooring).  This specific flooring is Jove Travertine 8mm.  One box covers 12.01 sq-ft. It is a heavy flooring.

 

Here I moved the bed a bit more to the left and put down a couple more rows.

 

Once I moved the bed and shuffled some other furniture I was able to rip out most of the remaining carpet and prep the floor.    

 
Here I started to lay 3 rows at a time which actually worked well as long as I maintained the stair step pattern instead of completing a single row before starting the next.
 
This is the glue I am using from the flooring shop.


Here I have most of main floor done. You can see that I have an angle into the bathroom and it transitions to porcelain tile.  I'm still deciding how to finish off that transition.

 

The main area except the transition is done here - I still had 2 closets to do as well though.

 

This is a view from the other end of the room toward the bathroom. The doorway frame on the right is one of the 2 closets.


Here is one of the closets. This is the only place I ended up with a small strip of tile - about 3/4" on the back wall.  I might have been able to prevent that with enough adjustments but it just wasn't worth the effort.

 

Here is the bathroom transition area.  I got some spare trim tile just laying in the doorway and I put a piece of the bedroom tile up to it for comparison.  The hights are very close. Other than for expansion of the bedroom tile, I might be able to do a "grouted caulk" between the 2 tile types. I'm still looking for what I like best.


For me, this was about a weeks worth of effort.  Ripping out carpet, scrapping drips from the drywall install and getting all the dirt/sand/nails/carpet fuzz up took some time as well.  Making sure each tile was tightly butted up was an effort as well - I needed some extra lighting and flashlight to see well enough.  A few blocks of wood and a rubber mallet helped with adjustments a good part of the time.

Now to get the mouldings in.  I just undercut the door frames with a jambsaw. I'll be replacing the door frames but didn't want more gapping holes than needed for now.  I'm still working out the threshold for the door that goes out to the lanai too. 

Thanks for looking!

Scott

Friday, March 26, 2021

SpringBoot Batch load CSV into Postgresql - external with K8s configmap

 This is a short demo of running a SpringBoot batch job in eclipse where the configuration is retrieved from a Microk8s configmap.  The setup can be extended to use K8s secrets but wasn't done here yet. 

I had worked with several other tools when initially trying to import this data into my database but I ran into a number of problems with the methods.  The biggest issue is some "complex" data as part of a set of fields that most import tools/processes don't handle correctly but where handled here fine.  It did take a few iterations to work out a few incorrect field data types but Spring Batch provides pretty clear information regarding the problematic fields and types.

 



 

Here you can see an example of what wasn't handled well by some other import methods. It usually included partially quoted data and also commas.


 Here is a quick screen shot of the Microk8s info showing my Postgresql database. My batch job uses the service name as the host portion of the connection string. For now, I manually update my DNS resolutions to map the service name to the service IP from outside of my cluster. I'm working toward that being an integrated/automated item requiring no manual intervention.



Thanks for looking and have a blessed day!

Scott

 


Sunday, March 7, 2021

Local Development, Microk8s Built-in registry and DNS Parity - Part 3

In part 2 of this, I had a SpringBoot service which was runnable from both an IDE and from Microk8s - with the configuration for both methods coming from a configmap in Microkk8s.

Here I want to go into the configuration a bit more because that part created a few headaches but I think it is sorted out now (for the most part).

To start with, one of the major enablers for this setup is a bootstrap.yml file.  In this case, I'm not using any application.properties file in the apps main/resources folder.  The use of the bootstrap file is to get required settings, well - bootstrapped before the majority of Spring auto-configuration starts up.

 Spring profiles are also a key part of this setup. The main spring config in the bootstrap file is defined for the profiles:

  • native
  • default
  • kubernetes

 I'll admit that I should have documented this better initially - a key aspect is the kubernetes profile though. There are likely other ways to get things working but so far this is cleanest and most reliable. Note that the kubernetes profile is used even when executing the service in the IDE.  I'll explain that a bit more in minute but first lets look at the initial part of the bootstrap configuration.

 spring:
  config:
    activate:
      on-profile:
      - native
      - default
      - kubernetes
  application:
      name: sb-note
  cloud:
    discovery:
      enabled: true
    kubernetes:
      enabled: true    
      config:
        enabled: true
        enable-api: true
        paths:
        - /deployments/config/application.properties
      discovery:
        enabled: true
      client:
        namespace: default
        clientCertFile: /var/snap/microk8s/current/certs/kubelet.crt
        caCertFile: /var/snap/microk8s/current/certs/kubelet.crt
        ca-cert-file: /var/snap/microk8s/current/certs/kubelet.crt
        trust-certs: true
        masterUrl: https://kubernetes:443
springdoc:
  swagger-ui.path: /swagger-ui.html
debug: true

 

Note that the various cloud/kubernetes aspects are enabled.  These are important for the dependencies:

  • org.springframework.cloud:spring-cloud-starter-bootstrap
  • org.springframework.cloud:spring-cloud-starter-kubernetes-fabric8-config
  •  org.springframework.cloud:spring-cloud-starter-kubernetes-fabric8
  •  org.springframework.cloud:spring-cloud-starter-kubernetes-fabric8-all

I may be able to simplify those a bit but that is what I have after thrashing a bit with a recent SpringCloud update. The combination provides the ability to "know about" kubernetes and use features like configmaps.  Since I always want to pull my main configuration using a configmap, I always use the kubernetes profile and the enablements above so configmaps are usable.  

Note that the "client" section is what generally provides any configuration needed so your app can leverage the "kubernetes" awareness and access those associated resources. Note that the client.masterUrl though is defined in the manner which the service needs it when it actually is running in Microk8s.  The https://kubernetes:443 is not accessible from outside of Microk8s.  So this config is all I needed for running in Kubernetes - but what about when running it from outside?

Well, there is a second part to the above bootstrap.yml file which is:

---
spring:
  config:
    activate:
      on-profile:
      - ide
  cloud:
    kubernetes:
      client:
        masterUrl: https://kubernetes.default.svc:16443

and when I run the service in the IDE, I add an additional spring profile to end of my list of active profiles: ide

The result is that the client.masterUrl of https://kubernetes.default.svc:16443 overrides the previous definition due to ordering. The kubernetes.default.svc is what I have been manually maintaining an IP for in my home routers DNS.  That DNS name resolves to the cluster IP of the kubernetes cluster and the port 16443 which is what Microk8s exposes it on - see their documentation on ports

So this allows the service to see and access kubernetes and the associated resources from both inside and outside of the cluster. Note that I may be able to move some of the other client settings to the "ide" profile but haven't gotten quite that far in my cleanup. I believe that this can be done because I don't think the various paths for the client section are probably visible as shows show - so are probably ignored when running inside kubernetes. 

Note, initially I had things working in a somewhat awkward fashion which this setup fixes. If you don't override the masterUrl then you can still make things work but it is odd.  Basically, if your deployment exposes the configmap as both a configmap AND an application.properties file - when running in kubernetes and the masterUrl doesn't resolve correctly, the configmap won't be found but the application.properties file is mounted and loaded via normal spring auto-configuration.  You'll see some error/warnings in logs but configuration is available.  Once I realized that is what I had done, I worked out this additional profile so to prevent that configuration from occurring.   The current config shown above doesn't result in those error conditions.  

 Note that the configmap is defined as the following.

namespace: default
data:
  application.properties: |-
    spring.profiles.active=kubernetes
    debug=false
    spring.application=sb-note
    spring.datasource.url=jdbc:postgresql://springboot-note-db1-svc.default.svc:5944/postgres
    spring.datasource.username=postgres
    spring.datasource.password=PASSWORD
    spring.jpa.database=POSTGRESQL
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    spring.jpa.hibernate.ddl-auto=update
    springdoc.swagger-ui.path=/swagger-ui.html
    logging.level.org.hibernate.SQL=DEBUG
    logging.level.org.hibernate.type=WARN
    spring.jpa.show-sql=true
    spring.jpa.properties.hibernate.format_sql=true
    javax.persistence.schema-generation.database.action=update

So the configmap data must be available to the service in some form or the database connection initialization will fail.  That is the one of the most visible ways you will know that it isn't finding the information - which is true while running in the IDE and in k8s as well.   I'll note that I am not using k8s secrets here yet - that would be the next step in doing a more "enterprise" setup. That should work in a similar fashion to the configmap setup.

 Note that so far, all this setup is for actual runtime and not deployment - although the above configmap is defined in the way that Jkube needs it so as to create the actual configmap during deployment.  

 For build/deployment, a few key properties are needed in the maven pom file.

        <java.version>11</java.version>
        <docker.starcases.registry>docker-star-cases.starcases.com:32000</docker.starcases.registry>
        <image.user>starcases</image.user>
        <spring-cloud.version>2020.0.1</spring-cloud.version>

        <jkube.masterUrl>https://kubernetes.default.svc:16443</jkube.masterUrl>
        <jkube.trustStoreFile>/var/snap/microk8s/current/certs/kubelet.crt</jkube.trustStoreFile>
        <jkube.version>1.1.1</jkube.version>
        <jkube.recreate>true</jkube.recreate>
        <jkube.deploy.ignoreServices>true</jkube.deploy.ignoreServices>
        <jkube.generator.name>${docker.starcases.registry}/${image.user}/${project.artifactId}:${project.version}</jkube.generator.name>
        <jkube-revision-history>1</jkube-revision-history>

 Note that I am having springboot build the service and JKube is repackaging into a docker compatible image and then deploying that image to the Microk8s registry and then deploying the other resources Jkube generates configuration for from my setup.

The main build is being done using the recent SpringBoot 2.3 feature enhancements - the pom.xml part of interest is.

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludeDevtools>false</excludeDevtools>
                    <release>11</release>
                    <image>
                        <name>${jkube.generator.name}</name>
                    </image>
                    <layers>
                        <enabled>true</enabled>
                        <includeLayerTools>true</includeLayerTools>
                    </layers>
                </configuration>
            </plugin>
        </plugins>

 And then rest of the repackaging and deployment is handled by:

        <profile>
            <id>kubernetes</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.eclipse.jkube</groupId>
                        <artifactId>kubernetes-maven-plugin</artifactId>
                        <version>${jkube.version}</version>

                        <configuration>
                            <profile>minimal</profile>
                            <buildStrategy>docker</buildStrategy>
                            <detail>true</detail>
                            <imagePullPolicy>Always</imagePullPolicy>

                            <logStdout>true</logStdout>
                            <verbose>true</verbose>

                            <failOnNoKubernetesJson>true</failOnNoKubernetesJson>
                            <failOnValidationError>true</failOnValidationError>

                            <skipExtendedAuth>true</skipExtendedAuth>
                            <pushRegistry>${docker.starcases.registry}</pushRegistry>

                            <skipBuild>true</skipBuild>
                            <kubernetesManifest>${basedir}/target/classes/META-INF/jkube/kubernetes.yml</kubernetesManifest>

                            <resources>
                                <labels>
                                    <all>
                                        <property>
                                            <name>app</name>
                                            <value>${project.artifactId}</value>
                                        </property>

                                        <property>
                                            <name>provider</name>
                                            <value>jkube</value>
                                        </property>
                                        <property>
                                            <name>group</name>
                                            <value>${project.groupId}</value>
                                        </property>
                                        <property>
                                            <name>version</name>
                                            <value>${project.version}</value>
                                        </property>

                                    </all>
                                </labels>
                            </resources>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>


There are likely a few items I can cleanup here but it is functional.  

 Note that the maven goal I use in the IDE for the Microk8s build / deployment is:

  • clean  spring-boot:build-image  k8s:resource  k8s:push  k8s:apply

And I specify a profile of "kubernetes".  I do have a few environmental settings as well - maven.test.skip, skip tests, and an item for trusting the kubernetes certificate which I may not need now (at one point I worked out some issues related to it but am noticing I didn't clean all settings in all the IDE launch configs). I'll have to recheck that - at one point I did need to add an additional name to the certificate to get things to match between the inside and outside kubernetes views of the world.

And then note that when launching the service in the IDE (as a SpringBoot app), the profiles that are enabled are: local,default,native,kubernetes,ide

As I've stated a few times, I might be able to simplify that list a little but haven't tried.  It grew a bit as I was trying to work with GraalVM and was copying settings back and forth between projects at one point.  


Hoping your day is blessed!

Scott