Kubernetes cluster for single machine
https://github.com/canonical/microk8s
Great tutorial
https://youtu.be/X48VuDVv0do?si=EXr4SGbll448VGZ4
sudo snap install microk8s
- microk8s help
- microk8s start
- microk8s stop
- microk8s kubectl
try to set in .zshrc
- mk: MicroK8s
- kc: KubeCtl
on when installed
- dns: CoreDNS
- ha-cluster: Configure high availability on the current node
- helm: the package manager for Kubernetes
- helm3: the package manager for Kubernetes
available
- cert-manager: Cloud native certificate management
- community: The community addons repository
- dashboard: The Kubernetes dashboard
- host-access: Allow Pods connecting to Host services smoothly
- hostpath-storage: Storage class; allocates storage from host directory
- ingress: Ingress controller for external access
- kube-ovn: An advanced network fabric for Kubernetes
- mayastor: OpenEBS MayaStor
- metallb: Loadbalancer for your Kubernetes cluster
- metrics-server: K8s Metrics Server for API access to service metrics
- minio: MinIO object storage
- observability: A lightweight observability stack for logs, traces and metrics
- prometheus: Prometheus operator for monitoring and logging
- rbac: Role-Based Access Control for authorisation
- registry: Private image registry exposed on localhost:32000
- storage: Alias to hostpath-storage add-on, deprecated
- minio: AWS s3 compatible storage
- ingress: For public service
- dashboard: UI for cluster status
Worth to try to see if everything is okay
microk8s kubectl get all -n kube-system
will show some system status and they should be all ready
When it looked not good, try inspect command
$ microk8s inspect
...
WARNING: IPtables FORWARD policy is DROP. Consider enabling traffic forwarding with: sudo iptables -P FORWARD ACCEPT
The change can be made persistent with: sudo apt-get install iptables-persistent
WARNING: Docker is installed.
File "/etc/docker/daemon.json" does not exist.
You should create it and add the following lines:
{
"insecure-registries" : ["localhost:32000"]
}
and then restart docker with: sudo systemctl restart docker
see also kubernetes/kubeadm#193 (comment) and kubernetes/minikube#4350 (comment)
You could try
- pods
- services
- deployment
- secret
- config map
- yaml configuration (infra as a software)
apiVersion: v1
kind: Secret
metadata:
name: mongodb-secret
type: Opaque
data:
mongo-root-username: <base64 string>
mongo-root-password: <base64 string>
commands
kubectl apply -f secret.yaml
secret/mongodb-secret created
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-depl
labels:
app: mongodb
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-username
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongodb-secret
key: g-root-password
---
apiVersion: v1
kind: Service
metadata:
name: mongodb-svc
spec:
selector:
app: mongodb
ports:
- protocol: TCP
port: 27017
targetPort: 27017
commands
$ kubectl apply -f mongo.yaml
deployment.apps/mongodb-depl created
$ kc get all
NAME READY STATUS RESTARTS AGE
pod/mongodb-depl-84d7c8b6dd-tpqbd 1/1 Running 0 6m43s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 89m
service/mongodb-svc ClusterIP 10.152.183.203 <none> 27017/TCP 3m47s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mongodb-depl 1/1 1 1 6m43s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mongodb-depl-84d7c8b6dd 1 1 1 6m43s
apiVersion: v1
kind: ConfigMap
metadata:
name: mongo-configmap
data:
database_url: mongodb-svc
Commands
$ kubectl apply -f mongo-configmap.yaml
configmap/mongo-configmap created
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-express-depl
labels:
app: mongo-express
spec:
replicas: 1
selector:
matchLabels:
app: mongo-express
template:
metadata:
labels:
app: mongo-express
spec:
containers:
- name: mongo-express
image: mongo-express
ports:
- containerPort: 8081
env:
- name: ME_CONFIG_MONGODB_ADMINUSERNAME
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-username
- name: ME_CONFIG_MONGODB_ADMINPASSWORD
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-password
- name: ME_CONFIG_MONGODB_SERVER
valueFrom:
configMapKeyRef:
name: mongo-configmap
key: database_url
---
apiVersion: v1
kind: Service
metadata:
name: mongo-express-svc
spec:
selector:
app: mongo-express
type: LoadBalancer
ports:
- protocol: TCP
port: 8081
targetPort: 8081
nodeProt: 30000
Commands
$ kubectl apply -f mongoexpress.yaml
deployment.apps/mongo-express-depl created
service/mongo-express-svc created
When all are up
$ kc get all
NAME READY STATUS RESTARTS AGE
pod/mongodb-depl-84d7c8b6dd-b4whl 1/1 Running 0 37s
pod/mongo-express-depl-84f7f67b89-zcqgs 1/1 Running 0 34s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 4h54m
service/mongodb-svc ClusterIP 10.152.183.73 <none> 27017/TCP 37s
service/mongo-express-svc LoadBalancer 10.152.183.186 <pending> 8081:30000/TCP 34s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mongodb-depl 1/1 1 1 37s
deployment.apps/mongo-express-depl 1/1 1 1 34s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mongodb-depl-84d7c8b6dd 1 1 1 37s
replicaset.apps/mongo-express-depl-84f7f67b89 1 1 1 34s
You can connect http://localhost:300000 for mongo-express
- what if I want to serve it like https://mongoexpress.example.com/
- yes, ingress (k8s nginx ingress controller)
- can I also serve another service to http://app.example.com/ from same node?
- yes, ingress as well
- can I also serve another service to http://app.example.com/api from same node?
- yes, ingress rules have many options
- can I add and update ssl certificates automatically?
- yes, install cert-manager
- where is my database saved? is that persistent? --> stateful set
... To be continued