From 5c5f01df2b90adcf3a71bcd4e597af314a47f690 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Tue, 23 Aug 2022 23:01:07 -0500 Subject: [PATCH] Using docker python --- Dockerfile | 2 +- .../kubernetes}/easyhaproxy.yml | 12 +-- examples/kubernetes/service.yml | 80 +++++++++++++++++++ examples/swarm/docker-compose.yml | 7 +- examples/swarm/host2.local.pem | 50 ++++++++++++ src/processor/__init__.py | 31 +++---- src/requirements.txt | 1 + 7 files changed, 151 insertions(+), 32 deletions(-) rename {kubernetes => examples/kubernetes}/easyhaproxy.yml (80%) create mode 100644 examples/kubernetes/service.yml create mode 100644 examples/swarm/host2.local.pem diff --git a/Dockerfile b/Dockerfile index 3fa515e..225c00a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ WORKDIR /scripts COPY src/ /scripts/ COPY assets / -RUN apk add --no-cache haproxy bash python3 py3-pip py-yaml docker certbot openssl \ +RUN apk add --no-cache haproxy bash python3 py3-pip py-yaml certbot openssl \ && ln -s /usr/bin/python3 /usr/bin/python \ && pip3 install --upgrade pip \ && pip install -r requirements.txt \ diff --git a/kubernetes/easyhaproxy.yml b/examples/kubernetes/easyhaproxy.yml similarity index 80% rename from kubernetes/easyhaproxy.yml rename to examples/kubernetes/easyhaproxy.yml index 000c238..2aba608 100644 --- a/kubernetes/easyhaproxy.yml +++ b/examples/kubernetes/easyhaproxy.yml @@ -38,17 +38,7 @@ spec: requests: cpu: "100m" memory: "128Mi" - #limits: - # cpu: "1" - # memory: "1Gi" - #securityContext: - # allowPrivilegeEscalation: true - # #runAsUser: 101 #nginx - # capabilities: - # drop: - # - ALL - # add: - # - NET_BIND_SERVICE + env: - name: EASYHAPROXY_DISCOVER value: kubernetes diff --git a/examples/kubernetes/service.yml b/examples/kubernetes/service.yml new file mode 100644 index 0000000..d98399f --- /dev/null +++ b/examples/kubernetes/service.yml @@ -0,0 +1,80 @@ +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: easyhaproxy-ingress + name: container-example + namespace: parking +spec: + rules: + - host: example.org + http: + paths: + - backend: + service: + name: container-example + port: + number: 8080 + pathType: ImplementationSpecific + - host: www.example.org + http: + paths: + - backend: + service: + name: container-example + port: + number: 8080 + pathType: ImplementationSpecific + +--- +apiVersion: v1 +kind: Service +metadata: + name: container-example + namespace: parking +spec: + ports: + - name: http + port: 8080 + selector: + app: container-example + type: ClusterIP + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: container-example + namespace: parking +spec: + replicas: 1 + revisionHistoryLimit: 10 + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + type: RollingUpdate + selector: + matchLabels: + app: container-example + template: + metadata: + labels: + app: container-example + spec: + containers: + - name: container-example + image: byjg/static-httpserver + ports: + - containerPort: 8080 + resources: + limits: + cpu: '0.05' + memory: '20Mi' + requests: + cpu: '0.05' + memory: '20Mi' + env: + - name: TITLE + value: "My Host Example" diff --git a/examples/swarm/docker-compose.yml b/examples/swarm/docker-compose.yml index 5c9627c..d9000bf 100644 --- a/examples/swarm/docker-compose.yml +++ b/examples/swarm/docker-compose.yml @@ -23,14 +23,15 @@ services: volumes: - /var/run/docker.sock:/var/run/docker.sock - ./host2.local.pem:/certs/haproxy/host2.local.pem + deploy: + replicas: 1 environment: - EASYHAPROXY_DISCOVER: docker + EASYHAPROXY_DISCOVER: swarm EASYHAPROXY_SSL_MODE: "loose" HAPROXY_CUSTOMERRORS: "true" HAPROXY_USERNAME: admin HAPROXY_PASSWORD: password HAPROXY_STATS_PORT: 1936 - ports: - "80:80/tcp" - "443:443/tcp" @@ -39,6 +40,7 @@ services: container: image: byjg/static-httpserver deploy: + replicas: 1 labels: easyhaproxy.http.redirect_ssl: "true" easyhaproxy.http.host: host1.local @@ -52,6 +54,7 @@ services: container2: image: byjg/static-httpserver deploy: + replicas: 1 labels: easyhaproxy.http.host: host2.local easyhaproxy.http.port: 80 diff --git a/examples/swarm/host2.local.pem b/examples/swarm/host2.local.pem new file mode 100644 index 0000000..917062a --- /dev/null +++ b/examples/swarm/host2.local.pem @@ -0,0 +1,50 @@ +-----BEGIN CERTIFICATE----- +MIIDqTCCApGgAwIBAgIUId5b9t9uqH78g02EzbWF6FKVw3gwDQYJKoZIhvcNAQEL +BQAwZDELMAkGA1UEBhMCQlIxFzAVBgNVBAgMDlJpbyBkZSBKYW5laXJvMRcwFQYD +VQQHDA5SaW8gZGUgSmFuZWlybzENMAsGA1UECgwEQUNNRTEUMBIGA1UEAwwLaG9z +dDIubG9jYWwwHhcNMjIwODE1MDQyNzA1WhcNMjMwODE1MDQyNzA1WjBkMQswCQYD +VQQGEwJCUjEXMBUGA1UECAwOUmlvIGRlIEphbmVpcm8xFzAVBgNVBAcMDlJpbyBk +ZSBKYW5laXJvMQ0wCwYDVQQKDARBQ01FMRQwEgYDVQQDDAtob3N0Mi5sb2NhbDCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMSKvrOahavCXnvSF5131hpo +6k65C57jgRQ84FaDj5MbJOVlYQVFtMG0XOk7a+hh5v1fe4wH0R7I6FDo0V9sS+ss +ko5bsElc1xYlg5HbuKq89vRSKg6EDlztx3BKbi912Pmt5vFGNJ16zcw77DUrQIXo +4I/b4a3pmBiWj43NoTIrmSWHtsGwwOj3iDvSweqdYXJIr3hpHH5u6pohjDoQvqDz +K6Mu8p6mhCUKNs7KFJnNInNG25oQT6O0n4OGtmgRjLWopdEnOhMkKsfIoI1XtlXB +LBDv7huICk3t5ywtfCQyO09kX7lFIgd5rn7+MjwH5WNeqbQJxuaqjoXQnNZUgUsC +AwEAAaNTMFEwHQYDVR0OBBYEFNhMBG8q6a+iK2nECwVTn6B9EXZOMB8GA1UdIwQY +MBaAFNhMBG8q6a+iK2nECwVTn6B9EXZOMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAJmudvx8+p5iIUsT8fm/fbVM0DA6qWALDYUJnTn3j6Lq4vpf +PFC+q1LmuWfBQMyqKrHrP3e493EctXoiSKZO6iN5dVJIur02OjGuiAEcsYuY1nLn +s9piiI+UEwxH6ux1NaHUnzsWauoBvRhzjXvO6SAVSZJYa9dY5mizXklDyDNuG5U0 +lXv9egMGBsy0dG6eFXkU5CPdxWU540yI2sCtSAj7z+WRUD5k7gJ7tVoY3//jHQZG +5STTmm5t9kpIZTWkptyJos9oZJFYMIXqW2Fc6tyLZpRp31R78tDs6ETIkToDc0RR +jz66th6HI+ZlgIBQhw09+hYAhBDe9+Dmd/SzQZc= +-----END CERTIFICATE----- +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDEir6zmoWrwl57 +0hedd9YaaOpOuQue44EUPOBWg4+TGyTlZWEFRbTBtFzpO2voYeb9X3uMB9EeyOhQ +6NFfbEvrLJKOW7BJXNcWJYOR27iqvPb0UioOhA5c7cdwSm4vddj5rebxRjSdes3M +O+w1K0CF6OCP2+Gt6ZgYlo+NzaEyK5klh7bBsMDo94g70sHqnWFySK94aRx+buqa +IYw6EL6g8yujLvKepoQlCjbOyhSZzSJzRtuaEE+jtJ+DhrZoEYy1qKXRJzoTJCrH +yKCNV7ZVwSwQ7+4biApN7ecsLXwkMjtPZF+5RSIHea5+/jI8B+VjXqm0Ccbmqo6F +0JzWVIFLAgMBAAECggEBAKceitVROQQ5e/mxRR9CfK1sNH/H3Ne3/1PkB6XIrFab +qB3evEatZOuon7A6NKEeTjl37Se+pdSVZOUXcqC/BzbraZre3+EhrkpIj72ApV+Y +2iwZiWVaaJQgI4uZ3mNAw8RaWJsj5S1a9I8LDOiQ5IZ45CmvABDPJeMScvJSvRRY +e5N0L6stqS7Z+IoyGVKUfp1iNO0YyywOUiSkIRXgscuRXZGYpiGPomsJ+Js1ejzW +jyStlZJEr4L1285rGPrmHqjTwFd+hG80Wc4179xL+WRE6HBEUZSiy95fe6kcPHXX +BgiVYtcFKmiBi2dTbxl4e94ut239i0HtlJ1ZJtLh+BECgYEA8a298K2zXkHosxhN +tRrH7XfMPTkHDDd3rxM21LT+fIXqinGUp9LYaDcbjuTPs8e33uKMd7R6Q40x89yW +IXNka/VL0PXUeV67aCVLLqgXDLGudluJinH0XvmI0CmBecFSMqIFmQlgqERoGGs3 +UMac0p876T4XkGQQJdf62bFpE4UCgYEA0DBH0PDlOpwXccDgXrMfayr8HAhI+G5R +yWQ//9iirtU83chwIWwkh53eLLMzLgdqJnPiWyaUW5BqzmYuD23nhxcQ7PNdIqOO +H1sE6zqLNshv46t5QKlh1Q4qjd7UqtgrSrY63RXJCMWTwnNMeDLtj8gaKbjkrG3R +BM2ildt6Uo8CgYBX7NDUli1SloH1XlsvD047S8FHaM7yl994F3J0UmDfpszcj1P4 +9pF64Mmq4/3Yt0li0mMuTb/Jgb3xrYgFJXkcecKahEVH3ropup+umsLAAIirUMQq +VSkFwJ0Qtnj/deDUwPNuaOX8cd65O5CFV6zIR9xBEDD8fBsP2ZLOzmefDQKBgQDF +m24vVthd/1cJdCgD+0VxNYXDHeIVXLFo1S0iLYCNLn3tjZlRQBKUXzZJe3ay0/rf +sNND7aSYHMYkTzydDJbc1PoNzxmyDUiTXpOWqyUExM/fbB1VUPE5h47AxqdZ2oGN +EtdgjpMZLmCIC2SkGsL+3NJok8UKHdpuErmmQIMk5QKBgQCgEWcYtLXC3YDYMFdI +UgcTebFqSs3mLYgub1xekW3IXR2yom4V5fQTLiF7Yfn2dpDW4IcMU0UJFYVsUlhK +aGtet4Vm5Nn8+Mghot5yAjqO9yAUaub7wgifKIe99tQKd8uZyCvJ0hhvmDDSfx4m +B/TEiFAO99yF49iSxEVSAS6pqQ== +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/src/processor/__init__.py b/src/processor/__init__.py index aea754f..c7ab3be 100644 --- a/src/processor/__init__.py +++ b/src/processor/__init__.py @@ -4,6 +4,7 @@ import yaml import sys import os import json +import docker from kubernetes import client, config from kubernetes.client.rest import ApiException @@ -106,34 +107,28 @@ class Static(ProcessorInterface): class Docker(ProcessorInterface): + def __init__(self, filename = None): + self.client = docker.from_env() + super().__init__() + def inspect_network(self): - docker = "/usr/bin/docker" - - containers_list = Functions.run_bash('DOCKER_PROCESSOR', docker + " ps -q", log_output=False) - containers_list.sort() - containers = list(set(containers_list)) self.parsed_object = {} - for container in containers: - self.parsed_object[container] = json.loads(''.join(Functions.run_bash('DOCKER_PROCESSOR', docker + ' inspect --format "{{ json .Config.Labels }}" ' + container, log_output=False))) + for container in self.client.containers.list(): + self.parsed_object[container.name] = container.labels def parse(self): self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) class Swarm(ProcessorInterface): - def inspect_network(self): - docker = "/usr/bin/docker" + def __init__(self, filename = None): + self.client = docker.from_env() + super().__init__() - node_list = ' '.join(Functions.run_bash('SWARM_PROCESSOR', docker + ' node ls -q', False)) - containers_list_raw = Functions.run_bash('SWARM_PROCESSOR', docker + ' node ps ' + node_list + ' --format "{{ .Name }}" --filter desired-state=running', log_output=False) - containers_list = [] - for container in containers_list_raw: - containers_list.append(container.split('.')[0]) - containers_list.sort() - containers = list(set(containers_list)) + def inspect_network(self): self.parsed_object = {} - for container in containers: - self.parsed_object[container] = json.loads(''.join(Functions.run_bash('SWARM_PROCESSOR', docker + ' service inspect --format "{{ json .Spec.Labels }}" ' + container, log_output=False))) + for container in self.client.services.list(): + self.parsed_object[container.attrs["Spec"]["Name"]] = container.attrs["Spec"]["Labels"] def parse(self): self.cfg = HaproxyConfigGenerator(ContainerEnv.read()) diff --git a/src/requirements.txt b/src/requirements.txt index 8327169..5c4ba98 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -2,5 +2,6 @@ pyyaml docker jinja2 pytest +docker kubernetes deepdiff \ No newline at end of file