Giter VIP home page Giter VIP logo

turing-pi-cluster's Introduction

Turing Pi Cluster - 7-node K3s Raspberry Pi Cluster

DEPRECATED: Please see my pi-cluster project for active development.

CI

Turing Pi - Raspberry Pi Compute Module Cluster

This repository is a companion to a YouTube series by Jeff Geerling in 2020:

You might also be interested in another Raspberry-Pi cluster I've maintained for years, the Raspberry Pi Dramble, which is a Kubernetes Pi cluster in my basement that hosts www.pidramble.com.

Compatibility

This cluster configuration has been tested with the following Raspberry Pi and OS combinations:

  • Raspberry Pi 4 model B and HypriotOS
  • Raspberry Pi 4 model B and Raspberry Pi OS (32-bit)
  • Raspberry Pi 4 model B and Raspberry Pi OS (64-bit)
  • Raspberry Pi Compute Module 3+ and HypriotOS

Other models of Raspberry Pi and Compute Modules may or may not work, but the main thing you need is a cluster with at least 7 GB of RAM and at least 12 available CPU cores (every current Pi has 4 CPU cores), otherwise not all of the software will be able to run well.

This configuration will definitely not run on the Pi Zero, or on Pis older than the Raspberry Pi 2 model B.

Usage

First, you need to make sure you have K3s running on your Pi cluster. Instructions for doing so are in Episodes 2 and 3 (linked above).

When you run the K3s Ansible playbook, make sure you have extra_server_args: "--node-taint k3s-controlplane=true:NoExecute" in your K3s group_vars/all.yml, so pods are not scheduled on the master node, and that all your nodes have unique hostnames (e.g. on Pi OS, run sudo hostnamectl set-hostname worker-01 to set a Pi to worker-01).

Then, you can deploy all the applications configured in this repository with the main.yml playbook:

  1. Make sure you have Ansible installed.

  2. Install Ansible requirements:

    ansible-galaxy role install -r requirements.yml
    ansible-galaxy collection install -r requirements.yml
    

    These commands can be consolidated into one ansible-galaxy install command once Ansible 2.10 is released.

  3. Copy the example.hosts.ini inventory file to hosts.ini. Make sure it has the master and nodes configured correctly.

  4. Edit the ingress_server_ip and load_balancer_server_ip in group_vars/all.yml and set them each to an IP address of one of the nodes. (Change any other variables in that file as necessary.)

  5. Run the playbook:

    ansible-playbook main.yml
    

Once that's done, there will be variety of applications running on your cluster, for example:

Software Address Notes
Prometheus http://prometheus.10.0.100.74.nip.io/ N/A
AlertManager http://alertmanager.10.0.100.74.nip.io/ N/A
Grafana http://grafana.10.0.100.74.nip.io/ Default login is admin/admin
Drupal http://drupal.10.0.100.74.nip.io/ N/A
Wordpress http://wordpress.10.0.100.74.nip.io/ N/A
Minecraft (kubectl get service -n minecraft) See EULA in Minecraft chart repo
Pi-hole http://pi.hole/ See pihole role README

The exact URLs will vary in your cluster; refer to the output of the Ansible playbook, which lists each service's exact URL.

Caveats

They are a'plenty.

First of all, the configurations in this repository were built for local demonstration purposes. There are some things that are insecure (like storing some database passwords in plain text), and other things that are just plain crazy (like trying to run all the above things on one tiny Pi-based cluster!).

There are a few architectural decisions that were made that are great for 'day one' setup, but if you tried to flex K3s' muscle and drop/replace nodes while the cluster is running, you'd likely start running into some, shall we say, 'fun' problems.

For example, the MariaDB PVCs are tied to the local node on which they were first deployed, and if you do something that results in the MariaDB Deployment to change nodes for the deployed Pod... you may run into warnings like FailedScheduling: 3 node(s) had volume node affinity conflict.

Therefore, if you want to use this project as a base, and are planning on doing anything more than a local demo cluster, you are responsible for making changes to support a more production-ready setup, with better security and better configuration of persistent volumes and multi-pod scalability.

To do these things correctly with Kubernetes takes a lot of work. It's usually very easy—maybe deceptively easy—to get something working. It's harder to get it working reliably in an automated fashion when rebuilding the cluster from scratch (that's about the level where this repository is). And harder still is getting it working reliably with easy maintenance, fault-tolerance, and scalability.

Kubernetes is no substitute for a thorough knowledge of system architecture and engineering!

Resetting the cluster

You'll likely want to blow away all the changes you've made in a cluster and start fresh every now and then. If you made a mistake, or something broke terribly, that problem goes away. Or, if you want to make sure you've automated the entire cluster build properly, it's best practice to rebuild a cluster frequently.

Regardless of the reason, here's how to quickly wipe the cluster clean (without re-flashing all the Raspberry Pis from scratch):

  1. In the k3s-ansible repository directory (which you used to set up the cluster), run:

    ansible-playbook -i inventory/hosts.ini reset.yml
    

    This command will likely have a few failures relating to files that can't be cleaned up until after a reboot.

  2. Reboot the Raspberry Pis (in the same directory):

    ansible -i inventory/hosts.ini all -m reboot -b
    
  3. Run the reset playbook a second time, to clean up the stragglers:

    ansible-playbook -i inventory/hosts.ini reset.yml
    
  4. Re-install K3s on the cluster:

    ansible-playbook -i inventory/hosts.ini site.yml
    

Now you can go back to the steps above under 'Usage' to set up applications inside the cluster!

Important note: Any files that were downloaded for this repository, like the monitoring repository, still exist in the pirate (HypriotOS) or pi (Raspberry Pi OS) user's home directory. For a more complete reset, also delete all those files and directories. Or to go thermonuclear, re-flash all the Pi's eMMC or microSD cards.

Author

The repository was created in 2020 by Jeff Geerling, who writes Ansible for DevOps and Ansible for Kubernetes.

turing-pi-cluster's People

Contributors

geerlingguy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

turing-pi-cluster's Issues

Can't access monitoring after deploying Pi Hole

Hi,
I just deployed a K3s cluster with your guide. Then I installed Prometheus + Grafana and Pi Hole.
After installing Pi Hole and rebooting I can't access Grafana and Prometheus anymore. I keep getting the block
page from Pi Hole. Even on devices where I'm using Google or Cloudfare DNS.

I'm fairly new to Kubernetes, so I'm not sure how to troubleshoot this issue.
Any idea?

Thanks! - Daniel

Wordpress example not working, mariadb fails

I am working through your tutorial, but I find that in the wordpress example, the mariadb fails to run. It keeps starting again and again, and I get the following error:

NAME                                 READY   STATUS             RESTARTS   AGE
wordpress-5c6b9f6dd9-6jgks           1/1     Running            0          4m23s
wordpress-mariadb-7ddc464c54-jkppm   0/1     CrashLoopBackOff   4          4m31s

My kubernetes cluster seems to run correctly, I get a nice grafana page. My hardware is 5 Raspberry Pi 3b+ running Rasbian Buster.

Add NoSchedule taint for master node

Using the extra_server_args: "" variable (in group_vars), I'd like to be able to disable scheduling of pods on the master node.

Maybe just extra_server_args: "--node-taint k3s-controlplane=true:NoExecute"?

Ubuntu 20.04 support?

Thanks for the youtube videos and sharing this project, I am trying to run this on my ubuntu pi4 cluster mixed with 2g and 8g pi4 running ubuntu 20.04.

This is the error when running cluster_monitoring step with the error Invalid kube-config file. No configuration found:

...
TASK [cluster_monitoring : Apply cluster-monitoring setup manifests.] *********************************************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/0namespace-namespace.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/0namespace-namespace.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210105.8357701-5732-86261092791131/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210105.8357701-5732-86261092791131/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210105.8357701-5732-86261092791131/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_9evf2i_g/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_9evf2i_g/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_9evf2i_g/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_9evf2i_g/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0alertmanagerCustomResourceDefinition.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0alertmanagerCustomResourceDefinition.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210107.949554-5732-57149823016690/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210107.949554-5732-57149823016690/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210107.949554-5732-57149823016690/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_6v1371vg/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_6v1371vg/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_6v1371vg/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_6v1371vg/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0podmonitorCustomResourceDefinition.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0podmonitorCustomResourceDefinition.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210111.512028-5732-52582036082351/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210111.512028-5732-52582036082351/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210111.512028-5732-52582036082351/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_l5_0yg0z/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_l5_0yg0z/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_l5_0yg0z/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_l5_0yg0z/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0prometheusCustomResourceDefinition.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0prometheusCustomResourceDefinition.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210113.467812-5732-138520549593050/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210113.467812-5732-138520549593050/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210113.467812-5732-138520549593050/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_vq12z_t5/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_vq12z_t5/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_vq12z_t5/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_vq12z_t5/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0prometheusruleCustomResourceDefinition.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0prometheusruleCustomResourceDefinition.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210117.5530372-5732-94339718559263/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210117.5530372-5732-94339718559263/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210117.5530372-5732-94339718559263/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_mehj05xo/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_mehj05xo/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_mehj05xo/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_mehj05xo/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0servicemonitorCustomResourceDefinition.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0servicemonitorCustomResourceDefinition.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210119.451422-5732-158088852298738/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210119.451422-5732-158088852298738/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210119.451422-5732-158088852298738/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_rq91oanx/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_rq91oanx/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_rq91oanx/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_rq91oanx/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0thanosrulerCustomResourceDefinition.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-0thanosrulerCustomResourceDefinition.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210121.481886-5732-34603329862942/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210121.481886-5732-34603329862942/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210121.481886-5732-34603329862942/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_ixljz3_h/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_ixljz3_h/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_ixljz3_h/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_ixljz3_h/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-clusterRole.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-clusterRole.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210125.097336-5732-226992599817137/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210125.097336-5732-226992599817137/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210125.097336-5732-226992599817137/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_0bwya7bd/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_0bwya7bd/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_0bwya7bd/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_0bwya7bd/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-clusterRoleBinding.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-clusterRoleBinding.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210126.96961-5732-112766986288014/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210126.96961-5732-112766986288014/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210126.96961-5732-112766986288014/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_d8ag4l5v/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_d8ag4l5v/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_d8ag4l5v/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_d8ag4l5v/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-deployment.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-deployment.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210128.832566-5732-11264225934061/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210128.832566-5732-11264225934061/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210128.832566-5732-11264225934061/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_30xmgngt/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_30xmgngt/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_30xmgngt/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_30xmgngt/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-service.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-service.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210130.707617-5732-54152633937418/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210130.707617-5732-54152633937418/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210130.707617-5732-54152633937418/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_xvdf2w3i/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_xvdf2w3i/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_xvdf2w3i/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_xvdf2w3i/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: kubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.
failed: [pi03.lab] (item=/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-serviceAccount.yaml) => {"ansible_loop_var": "item", "changed": false, "item": "/home/ubuntu/cluster-monitoring/manifests/setup/prometheus-operator-serviceAccount.yaml", "module_stderr": "Shared connection to pi03.lab closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210132.561901-5732-131362353675879/AnsiballZ_k8s.py\", line 100, in <module>\r\n    _ansiballz_main()\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210132.561901-5732-131362353675879/AnsiballZ_k8s.py\", line 92, in _ansiballz_main\r\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n  File \"/home/ubuntu/.ansible/tmp/ansible-tmp-1626210132.561901-5732-131362353675879/AnsiballZ_k8s.py\", line 40, in invoke_module\r\n    runpy.run_module(mod_name='ansible_collections.community.kubernetes.plugins.modules.k8s', init_globals=dict(_module_fqn='ansible_collections.community.kubernetes.plugins.modules.k8s', _modlib_path=modlib_path),\r\n  File \"/usr/lib/python3.8/runpy.py\", line 207, in run_module\r\n    return _run_module_code(code, init_globals, run_name, mod_spec)\r\n  File \"/usr/lib/python3.8/runpy.py\", line 97, in _run_module_code\r\n    _run_code(code, mod_globals, init_globals,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/tmp/ansible_k8s_payload_f3911azz/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 273, in <module>\r\n  File \"/tmp/ansible_k8s_payload_f3911azz/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/modules/k8s.py\", line 269, in main\r\n  File \"/tmp/ansible_k8s_payload_f3911azz/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/raw.py\", line 174, in execute_module\r\n  File \"/tmp/ansible_k8s_payload_f3911azz/ansible_k8s_payload.zip/ansible_collections/community/kubernetes/plugins/module_utils/common.py\", line 189, in get_api_client\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 792, in load_kube_config\r\n    loader = _get_kube_config_loader(\r\n  File \"/usr/local/lib/python3.8/dist-packages/kubernetes/config/kube_config.py\", line 751, in _get_kube_config_loader\r\n    raise ConfigException(\r\nkubernetes.config.config_exception.ConfigException: Invalid kube-config file. No configuration found.\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}

PLAY RECAP ********************************************************************************************************************************************************************************
pi03.lab                   : ok=9    changed=6    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0  

Drupal image not working

I wrote this in a comment under your YouTube video, but am not sure if you've seen it.

I am working through your tutorial, and found that I cannot create the Drupal website. It appears to be a problem with Drupal. After choosing the language and then a profile, no matter which profile I choose, I get this error message:

Error
The website encountered an unexpected error. Please try again later.
Drupal\Core\Config\UnmetDependenciesException: Configuration objects provided by <em class="placeholder">standard</em> have unmet dependencies: <em class="placeholder">block.block.bartik_account_menu (block), block.block.bartik_help (help, block), block.block.bartik_search (search, block), block_content.type.basic (block_content), comment.type.comment (comment), contact.form.feedback (contact), core.entity_form_display.block_content.basic.default (text), core.entity_form_display.node.article.default (image.style.thumbnail, comment, image, path, text), core.entity_form_display.node.page.default (path, text), core.entity_form_display.user.user.default (image.style.thumbnail, image), core.entity_view_display.node.article.default (image.style.large, comment, image, text), core.entity_view_display.node.article.rss (core.entity_view_mode.node.rss), core.entity_view_display.node.article.teaser (core.entity_view_mode.node.teaser, image.style.medium, image, text), core.entity_view_display.node.page.teaser (core.entity_view_mode.node.teaser, text), editor.editor.basic_html (ckeditor, editor), field.field.block_content.basic.body (field.storage.block_content.body, text, field), field.field.comment.comment.comment_body (field.storage.comment.comment_body, text, field), field.field.node.article.body (field.storage.node.body, text, field), field.field.node.article.comment (comment, field), field.field.node.article.field_image (image, field), field.field.node.article.field_tags (field), field.storage.node.comment (comment, node, field), field.storage.node.field_image (file, image, node, field), field.storage.node.field_tags (node, taxonomy, field), field.storage.user.user_picture (file, image, field), filter.format.basic_html (editor, filter), filter.format.restricted_html (filter), node.type.article (node), rdf.mapping.comment.comment (comment, rdf), rdf.mapping.node.article (node, rdf), rdf.mapping.taxonomy_term.tags (taxonomy, rdf), taxonomy.vocabulary.tags (taxonomy)</em> in Drupal\Core\Config\UnmetDependenciesException::create() (line 98 of core/lib/Drupal/Core/Config/UnmetDependenciesException.php).
Drupal\Core\Config\UnmetDependenciesException::create('standard', Array) (Line: 509)
Drupal\Core\Config\ConfigInstaller->checkConfigurationToInstall('module', 'standard') (Line: 132)
Drupal\Core\ProxyClass\Config\ConfigInstaller->checkConfigurationToInstall('module', 'standard') (Line: 161)
Drupal\Core\Extension\ModuleInstaller->install(Array, ) (Line: 83)
Drupal\Core\ProxyClass\Extension\ModuleInstaller->install(Array, ) (Line: 1644)
install_install_profile(Array) (Line: 702)
install_run_task(Array, Array) (Line: 577)
install_run_tasks(Array, NULL) (Line: 117)
install_drupal(Object) (Line: 44)

K3s spitting out lots of logs from metadatainformer/informer

K3s is spitting out a log message like the following, five times per second. The master node is stuck at a load of 1.5-2.0:

May 23 20:29:53 turing-master k3s[334]: E0523 20:29:53.450194 334 reflector.go:153] k8s.io/client-go/metadata/metadatainformer/informer.go:89: Failed to list *v1.PartialObjectMetadata: the server could not find the requested resource

See related issue: k3s-io/k3s#1259

Use Prometheus and Grafana for Pi monitoring

This is really the first thing I like to have available on a K8s cluster, because it lets me observe performance and things like potential throttling and resource contention issues.

From past research, a few articles that have been interesting include:

In the end, I plan on having this be part of an Ansible playbook in this repository; maybe with a role or two for some of the things that have to be deployed to the Pis themselves (and can't be deployed into K8s directly) like node-exporter.

Question: K8S HA setup

Hi,

is my understanding correct that Turing Pi Cluster defines only a single master node, and therefore this solution disqualifies for a HA setup of K8S.
Is this correct?

Regards
Thomas

2 master k3s kubernates

i try 2 master with kubernates but looks like it is not working. i might got wrong with configuration

is this possible with k3s kuberates to have 2 master? looking solution if master is down.

thanks

Question: 64bit OS on master/worker nodes

Hello,

can you please share information when 64bit OS on master/worker nodes is required?
In my understanding this depends on the applications that are running on the cluster, right?

I intend to deploy a cluster solution running K8S + Rancher Longhorn.
And I think 64bit is required here.

Regards
Thomas

Setting up cluster_monitoring fails with python kubernetes-client version 12

When running the playbook I receive errors on cluster_monitoring tasks:

"msg": "Couldn't connect to Kubernetes: HTTPConnectionPool(host='localhost', port=80): Max retries exceeded with url: /version (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xb4b06150>: Failed to establish a new connection: [Errno 111] Connection refused'))"

Apparently the error is related to python's kubernetes-client version >11 and has already been mentioned here.

Setting pip package version openshift~=0.11.2 in roles/setup/tasks/main.yml fixed it for me (as it requires kubernetes).

KubeControllerManagerDown & kubeSchedulerDown

Hi
First thing thank you for your content you put up. I am attempting to build a cluster of 3 Pi 4's that I ran this script against.
After getting the monitoring running I am seeing an alert for the KubeController and the Scheduler are down. I think I have found the solution but have no idea how to apply it can you point me in the right direction?

this is the patch

kubeadm-patches/kube-controller-manager+json.yaml

  • op: add
    path: /spec/containers/0/command/-
    value: --bind-address=SOME_IP
  • op: replace
    path: /spec/containers/0/livenessProbe/httpGet/host
    value: SOME_IP
  • op: replace
    path: /spec/containers/0/startupProbe/httpGet/host
    value: SOME_IP

kubeadm-patches/kube-scheduler+json.yaml

  • op: add
    path: /spec/containers/0/command/-
    value: --bind-address=SOME_IP
  • op: replace
    path: /spec/containers/0/livenessProbe/httpGet/host
    value: SOME_IP
  • op: replace
    path: /spec/containers/0/startupProbe/httpGet/host
    value: SOME_IP

it was from this GitHub posting
kubernetes/kubeadm#2388
the other one is this
prometheus-operator/kube-prometheus#718

Thanks
Patrick

i2c help or guidence - powered off all nodes with i2c

Hi Jeff,
I know this cry for help is long shoot but Im little desparate since i coudnt find any reference on internet
Your idea or guidence is most welcome

By accident i sent command via i2c to shutdown all nodes.
Done so far:

  • connected second raspbarry via GPIO i2c (pin3 SDA and pin5 SCL) to Turing external i2C
  • via i2c-tools tried i2cdetect but it doesent find any device
  • RPi 3B+ OS Bullseye
    Clossest description to solution i found here:
    https://github.com/nicholaswilde/turing-pi-scripts
    WARNING:The register which controls the power to each board is backed by an EEPROM. Don't set all bits in there to 0, otherwise you won't be able to boot and correct it. A fix is to set register 0xF4 to 1 which would send the writes to the shadow SRAM, instead of the EEPROM. A fix for this is to connect an external raspberry pi to the I2C External pins and reset the registers. |

PS: Im just start learning Kubernetes and Ansible

Kubeconfig file location

Since you specify using the Ansible repository to build the K3s cluster this probably shouldn' t be classed as an issue but maybe worth flaggng.

If you have built your k3s cluster by alternate means you may end up with your kubeconfig file in /etc/rancher/k3s/k3s.yaml rather than ~/.kube/config.

https://rancher.com/docs/k3s/latest/en/cluster-access/

When you get to the k8s modules in the playbook the playbook crashes with a python NONTYPE error because the modules default to to looking for the kubeconfig file in ~/.kube/config I guess.

I guess there is an 'correct' override somewhere, but it was late and I just copied the config to the location expected , not had chance to look for it yet for the correct override yet.

exec format error

Hello,
After installing Helm on the Pi4 cluster (Ubuntu 20.04 server ARM64) with your youtube method and with curl -L https://git.io/get_helm.sh | bash

I have the following error:
kube-system tiller-deploy-6974685dbc-zpqb9 0/1 CrashLoopBackOff 22

Any solutions? :-)

Error installing pihole on k3s cluster

@geerlingguy Following the guide to install k3s and pihole, I ran into an issue with the installation of the pihole helm chart.
This occurs when using ubuntu as the os for the nodes.

image

image

It appears that dns resolution fails during installation.

Question - Pihole client Ip address

I've got pihole running on a kubernetes cluster with 1 master node and 2 workers.
What I'm observing is that the pihole is not displaying the the primary network (host network) ip of the clients connecting to it.

Instead, I get an ip in the cni0 interface network range.

Host network - 192.168.3.0/24
cni0 network - 10.42.1.0/24

Device using pi.hole for dns ip - 192.168.3.5
Pihole shows the clientIp as 10.42.1.26

image

Benchmarks on the Turing Pi Cluster

See related: Test Performance and Functionality on Raspberry Pi OS 64-bit

With the full configuration (excluding NextCloud), all tests run 4x, discarded first result (unless noted), then averaged the next 3:

Disk Benchmarks

Disk 4K Random Read 4K Random Write
CM3+ 8 GB eMMC 8.99 MB/sec 9.20 MB/sec
CM3+ microSD - Samsung Evo+ 32GB 6.97 MB/sec 2.90 MB/sec
CM3+ Kingston USB 2.0 SSD 8.87 MB/sec 10.04 MB/sec
Pi 4 microSD - Samsung Evo+ 32GB 11.81 MB/sec 3.25 MB/sec
Pi 4 Kingston USB 3.0 SSD w/o UASP 14.41 MB/sec 23.28 MB/sec
Pi 4 Kingston USB 3.0 SSD w/ UASP 20.59 MB/sec 28.54 MB/sec
  • iozone -e -I -a -s 100M -r 4k -i 0 -i 1 -i 2 (installed using these directions)

(Another note: The onboard eMMC also does large file writes at ~5-10 MB/sec whereas the microSD cards can do 20-40 MB/sec in some cases... but the eMMC is a way better option for general purpose computing since it's more durable and 3x faster than the fastest microSD cards for random IO (and 10-100x faster than the majority of microSD cards I've tested).

Network Benchmarks

Configuration Speed
Pi 4 2GB in Dramble 936 Mbps
CM3+ in Turing Pi 95 Mbps
  • iperf -s on Pi master node, iperf -c [pi-pi] on my Mac, connected through TRENDnet 10/100/1000 5-port network switch.

Note that the Turing Pi cluster does support the full 95 Mbps on each Pi simultaneously. So you can saturate a 1 Gbps connection to the Turing Pi cluster as a whole.

Full System Benchmarks

7-node Turing Pi Cluster

32-bit HypriotOS

Test Result
Drupal, authenticated (ab) 6.65 req/s
Drupal, anonymous (wrk) 28.29 req/s
Wordpress, authenticated (ab) 21.35 req/s
Wordpress, anonymous (wrk) 25.53 req/s
Minecraft, world initialization 983 seconds1 (~16.4 min)

4-node Pi Dramble Cluster (Running K3s, same configs)

32-bit HypriotOS

Test Result
Drupal, authenticated (ab) 14.12 req/s
Drupal, anonymous (wrk) 85.85 req/s
Wordpress, authenticated (ab) 31.36 req/s
Wordpress, anonymous (wrk) 40.36 req/s
Minecraft, world initialization 407 seconds1 (~6.8 min)

32-bit Raspberry Pi OS

Test Result
Drupal, authenticated (ab) 12.71 req/s
Drupal, anonymous (wrk) 95.87 req/s
Wordpress, authenticated (ab) 39.51 req/s
Wordpress, anonymous (wrk) 49.74 req/s
Minecraft, world initialization 300 seconds (~5 min)

64-bit Raspberry Pi OS

Test Result
Drupal, authenticated (ab) 10.84 req/s
Drupal, anonymous (wrk) 73.67 req/s
Wordpress, authenticated (ab) 36.64 req/s
Wordpress, anonymous (wrk) 42.69 req/s
Minecraft, world initialization 400 seconds1 (~6.7 min)
  • ab test example: ab -n 100 -c 10 -C "SESSION=COOKIE" http://drupal.10.0.100.74.nip.io/
  • wrk test example: wrk -t4 -c100 -d30 http://drupal.10.0.100.74.nip.io/
  • Minecraft initialization time from kubectl logs -n minecraft -l app=minecraft-minecraft | grep Done

1 This test needs to be re-run after 15 minute cool-down and run three times in progression. The first time I ran the tests I accidentally only took the first run, and didn't take the average of the final three runs. Oops.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.