Skip to content

Commit

Permalink
Update (#11)
Browse files Browse the repository at this point in the history
* Update up cluster

* Add ignore __pycache__

* Fix install requrements

* Add check ready nodes
  • Loading branch information
text-adi authored Jun 24, 2024
1 parent 41872ae commit f21916b
Show file tree
Hide file tree
Showing 6 changed files with 190 additions and 42 deletions.
52 changes: 10 additions & 42 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ jobs:

steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
cache-dependency-path: requirements.txt

- name: Get last version k0s
id: last_tag_k0s
Expand All @@ -100,58 +105,21 @@ jobs:
tail -n 1)
echo "value=$version" >> $GITHUB_OUTPUT
- name: UP master k0s
run: |
docker run -d --name k0s --hostname k0s --privileged --cgroupns=host -v /sys/fs/cgroup:/sys/fs/cgroup:rw -v /var/lib/k0s -p 6443:6443 docker.io/k0sproject/k0s:${{ steps.last_tag_k0s.outputs.value }}
- name: Create dir
run: mkdir -p ~/.kube

- name: Get admin conf
- name: Install requirements.txt
run: |
while true;
do
docker exec k0s cat /var/lib/k0s/pki/admin.conf > ~/.kube/config && break
sleep 1
done
pip install -r requirements.txt
- name: Check Ready nodes
- name: UP Cluster
working-directory: scripts
run: |
while true;
do
(kubectl get nodes k0s --no-headers | grep ' Ready') && break
echo 'Not ready k0s nodes'; sleep 1
done
python up-cluster.py --tag=${{ steps.last_tag_k0s.outputs.value }} --workers=2 --ready-wait=true > ~/.kube/config
- name: Check k0s version
run: kubectl version

- name: Run worker
run: |
token=$(docker exec -i k0s k0s token create --role=worker)
docker run -d --name k0s-worker1 --hostname k0s-worker1 --privileged --cgroupns=host -v /sys/fs/cgroup:/sys/fs/cgroup:rw -v /var/lib/k0s docker.io/k0sproject/k0s:${{ steps.last_tag_k0s.outputs.value }} k0s worker $token
- name: Verify k0s Nodes
timeout-minutes: 5
env:
COUNT_NODES: 2
TIMEOUT: 1
run: |
while true;
do
count=$(kubectl get nodes --no-headers | grep -c ' Ready')
if [[ "$count" == "${{ env.COUNT_NODES }}" ]]; then
echo "All Nodes is ready"
break;
elif [[ "$count" != "${{ env.COUNT_NODES }}" ]]; then
kubectl get nodes
echo "Count nodes ${count}"
echo 'Check again after ${{ env.TIMEOUT }} seconds';
sleep ${{ env.TIMEOUT }};
fi
done
- name: Check Ready all nodes
run: kubectl get nodes --no-headers

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
.idea/
.venv/
.env
**/__pycache__/
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
docker==7.1.0
Binary file added scripts/__pycache__/cluster.cpython-312.pyc
Binary file not shown.
149 changes: 149 additions & 0 deletions scripts/cluster.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
import json
import time

import docker
from docker.models.containers import ExecResult
from docker.models.resource import Model


class K0SCluster(object):
image = 'docker.io/k0sproject/k0s'
project: str
tag: str

master: Model | None = None

def __init__(self, tag: str, project: str = 'k0s'):
self.client = docker.from_env()
self.tag = tag
self.project = project

def create_master(self):
"""Run master nodes"""

container_name = '%s-master' % (self.project,)
labels = dict(
item='cluster',
product='k0s',
type='master',
)
volume = self.client.volumes.create(
name=container_name,
driver='local',
labels=labels,
)

container = self.client.containers.run(
image='%s:%s' % (self.image, self.tag),
labels=labels,
name=container_name,
hostname=container_name,
privileged=True,
volumes={volume.name: {'bind': '/var/lib/k0s', 'mode': 'rw'}},
ports={'6443/tcp': 6443},
cgroupns='host',
command='k0s controller',
detach=True,
)
if container is None:
return False
self.master = container
return True

@property
def master_token(self):
"""Get master token for create worker nodes"""
while True:
result: ExecResult = self.master.exec_run('k0s token create --role=worker')
if result.exit_code != 0:
time.sleep(1)
continue
return result.output.decode('utf-8')

@property
def admin_config(self):
while True:
result: ExecResult = self.master.exec_run('cat /var/lib/k0s/pki/admin.conf')
if result.exit_code != 0:
time.sleep(1)
continue
return result.output.decode('utf-8')

@property
def workers(self):
containers = self.client.containers.list(
filters=dict(
label=['item=cluster', 'product=k0s', 'type=worker'],
)
)
return containers

def create_workers(self, count_nodes: int):
"""Run worker nodes"""
token = self.master_token
for i in range(count_nodes):
container_name = '%s-worker-%s' % (self.project, i + 1,)
labels = dict(
item='cluster',
product='k0s',
type='worker',
)
volume = self.client.volumes.create(
name=container_name,
driver='local',
labels=labels,
)
containers = self.client.containers.run(
image='%s:%s' % (self.image, self.tag),
labels=labels,
name=container_name,
hostname=container_name,
volumes={volume.name: {'bind': '/var/lib/k0s', 'mode': 'rw'}},
privileged=True,
cgroupns='host',
command='k0s worker %s' % (token,),
detach=True,
)

while 1:
if containers.status == 'created':
break
time.sleep(0.1)

def delete_cluster(self):
containers = self.client.containers.list(
all=True,
filters=dict(
label=['item=cluster', 'product=k0s']
)
)
for container in containers:
container.remove(force=True)

volumes = self.client.volumes.list(
filters=dict(
label=['item=cluster', 'product=k0s']
)
)
for volume in volumes:
volume.remove(force=True)

def is_ready_nodes(self):
while True:
result: ExecResult = self.master.exec_run('k0s kubectl get nodes -o json')
if result.exit_code != 0:
time.sleep(1)
continue

workers = self.workers
output = result.output.decode('utf-8')
response_data = json.loads(output)
if not len(response_data['items']) == len(workers):
time.sleep(1)
continue

for item in response_data['items']:
last_status = item['status']['conditions'][-1]
if not last_status['type'] == 'Ready':
return False
return True
27 changes: 27 additions & 0 deletions scripts/up-cluster.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import sys
import time

from cluster import K0SCluster


def main(*args, **kwargs):
params = dict()

for arg in args:
arg: str
if '=' in arg and arg.startswith('--'):
key, value = arg.lstrip('-').split('=')
params[key] = value
cluster = K0SCluster(params['tag'])
cluster.delete_cluster()
cluster.create_master()
cluster.create_workers(int(params['workers']))
while params['ready-wait']:
if cluster.is_ready_nodes():
break
time.sleep(1)
print(cluster.admin_config)


if __name__ == '__main__':
main(*sys.argv)

0 comments on commit f21916b

Please sign in to comment.