blob: 315a6487e29653366e74610eadf2385276b5849c [file] [log] [blame]
marcoacdae7e2015-12-02 15:35:37 +01001
2==================
3Kubernetes Formula
4==================
5
Jakub Pavlik495d06f2016-06-17 11:33:05 +02006Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications.
7
8This formula deploys production ready Kubernetes and generate Kubernetes manifests as well.
marcoacdae7e2015-12-02 15:35:37 +01009
10Based on official Kubernetes salt
11https://github.com/kubernetes/kubernetes/tree/master/cluster/saltbase
12
13Extended on Contrail contribution https://github.com/Juniper/kubernetes/blob/opencontrail-integration/docs/getting-started-guides/opencontrail.md
14
15
16Sample pillars
17==============
18
Tomáš Kukrál189da4b2017-01-18 14:30:09 +010019**REQUIRED:** Define image to use for hyperkube, CNIs and calicoctl image
20
21.. code-block:: yaml
22
23 parameters:
24 kubernetes:
25 common:
26 hyperkube:
Tomáš Kukrála636f0e2017-03-21 11:09:55 +010027 image: gcr.io/google_containers/hyperkube:v1.5.2
Tomáš Kukrál189da4b2017-01-18 14:30:09 +010028 pool:
29 network:
30 calicoctl:
31 image: calico/ctl
32 cni:
33 image: calico/cni
34
Tomáš Kukrál25a64d72017-03-23 14:14:07 +010035Enable helm-tiller addon
Tomáš Kukrál1b50f772017-03-23 12:51:32 +010036
37.. code-block:: yaml
38
39 parameters:
40 kubernetes:
41 master:
42 addons:
43 helm:
44 enabled: true
45
Matthew Mosesohnbf9d3fb2017-05-17 16:17:02 +030046Enable calico-policy addon
47
48.. code-block:: yaml
49
50 parameters:
51 kubernetes:
52 master:
53 addons:
54 calico_policy:
55 enabled: true
56
Tomáš Kukrál25a64d72017-03-23 14:14:07 +010057Enable netchecker addon
58
59.. code-block:: yaml
60
61 parameters:
62 kubernetes:
63 master:
64 namespace:
65 netchecker:
66 enabled: true
67 addons:
68 netchecker:
69 enabled: true
Tomáš Kukrál1b50f772017-03-23 12:51:32 +010070
Tomáš Kukrálf78baa62017-04-20 16:18:16 +020071Configure service verbosity
72
73.. code-block:: yaml
74
75 parameters:
76 kubernetes:
77 master:
78 verbosity: 2
79 pool:
80 verbosity: 2
81
Tomáš Kukrálaff35262017-04-18 12:37:45 +020082Enable autoscaler for dns addon. Poll period can be skipped.
83
84.. code-block:: yaml
85
86 kubernetes:
87 master:
88 addons:
89 dns:
90 domain: cluster.local
91 enabled: true
92 replicas: 1
93 server: 10.254.0.10
94 autoscaler:
95 enabled: true
96 poll-period-seconds: 60
97
98
Tomáš Kukrál6ef3f892017-02-15 12:02:22 +010099Pass aditional parameters to daemons:
100
101.. code-block:: yaml
102
103 parameters:
104 kubernetes:
105 master:
106 apiserver:
107 daemon_opts:
108 storage-backend: pigeon
109 controller_manager:
110 daemon_opts:
111 log-dir: /dev/nulL
112 pool:
113 kubelet:
114 daemon_opts:
115 max-pods: "6"
116
Tomáš Kukrál189da4b2017-01-18 14:30:09 +0100117
Ales Komarek688a04c2016-07-15 15:12:30 +0200118Containers on pool definitions in pool.service.local
119
Jakub Pavlik7e985322016-07-17 13:16:15 +0200120.. code-block:: yaml
121
122 parameters:
123 kubernetes:
124 pool:
125 service:
126 local:
127 enabled: False
128 service: libvirt
129 cluster: openstack-compute
130 namespace: default
131 role: ${linux:system:name}
132 type: LoadBalancer
133 kind: Deployment
134 apiVersion: extensions/v1beta1
135 replicas: 1
136 host_pid: True
137 nodeSelector:
138 - key: openstack
139 value: ${linux:system:name}
140 hostNetwork: True
141 container:
142 libvirt-compute:
143 privileged: True
144 image: ${_param:docker_repository}/libvirt-compute
145 tag: ${_param:openstack_container_tag}
Ales Komarek688a04c2016-07-15 15:12:30 +0200146
147Master definition
148
marcoacdae7e2015-12-02 15:35:37 +0100149.. code-block:: yaml
150
151 kubernetes:
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200152 master:
153 addons:
154 dns:
155 domain: cluster.local
156 enabled: true
157 replicas: 1
158 server: 10.254.0.10
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200159 admin:
160 password: password
161 username: admin
162 apiserver:
163 address: 10.0.175.100
Swann Croisetff97efc2017-02-23 13:32:33 +0100164 secure_port: 443
165 insecure_address: 127.0.0.1
166 insecure_port: 8080
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200167 ca: kubernetes
168 enabled: true
169 etcd:
170 host: 127.0.0.1
171 members:
172 - host: 10.0.175.100
173 name: node040
174 name: node040
175 token: ca939ec9c2a17b0786f6d411fe019e9b
176 kubelet:
177 allow_privileged: true
178 network:
179 engine: calico
180 hash: fb5e30ebe6154911a66ec3fb5f1195b2
181 private_ip_range: 10.150.0.0/16
182 version: v0.19.0
183 service_addresses: 10.254.0.0/16
184 storage:
185 engine: glusterfs
186 members:
187 - host: 10.0.175.101
188 port: 24007
189 - host: 10.0.175.102
190 port: 24007
191 - host: 10.0.175.103
192 port: 24007
193 port: 24007
194 token:
195 admin: DFvQ8GJ9JD4fKNfuyEddw3rjnFTkUKsv
196 controller_manager: EreGh6AnWf8DxH8cYavB2zS029PUi7vx
197 dns: RAFeVSE4UvsCz4gk3KYReuOI5jsZ1Xt3
198 kube_proxy: DFvQ8GelB7afH3wClC9romaMPhquyyEe
199 kubelet: 7bN5hJ9JD4fKjnFTkUKsvVNfuyEddw3r
200 logging: MJkXKdbgqRmTHSa2ykTaOaMykgO6KcEf
201 monitoring: hnsj0XqABgrSww7Nqo7UVTSZLJUt2XRd
202 scheduler: HY1UUxEPpmjW4a1dDLGIANYQp1nZkLDk
203 version: v1.2.4
204
marcoacdae7e2015-12-02 15:35:37 +0100205
206 kubernetes:
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200207 pool:
208 address: 0.0.0.0
209 allow_privileged: true
210 ca: kubernetes
211 cluster_dns: 10.254.0.10
212 cluster_domain: cluster.local
213 enabled: true
214 kubelet:
215 allow_privileged: true
216 config: /etc/kubernetes/manifests
217 frequency: 5s
218 master:
219 apiserver:
220 members:
221 - host: 10.0.175.100
222 etcd:
223 members:
224 - host: 10.0.175.100
225 host: 10.0.175.100
226 network:
227 engine: calico
228 hash: fb5e30ebe6154911a66ec3fb5f1195b2
229 version: v0.19.0
230 token:
231 kube_proxy: DFvQ8GelB7afH3wClC9romaMPhquyyEe
232 kubelet: 7bN5hJ9JD4fKjnFTkUKsvVNfuyEddw3r
233 version: v1.2.4
marcoacdae7e2015-12-02 15:35:37 +0100234
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200235Kubernetes with OpenContrail network plugin
236------------------------------------------------
marcoacdae7e2015-12-02 15:35:37 +0100237
238On Master:
239
240.. code-block:: yaml
241
242 kubernetes:
243 master:
244 network:
245 engine: opencontrail
246 host: 10.0.170.70
247 port: 8082
248 default_domain: default-domain
249 default_project: default-domain:default-project
250 public_network: default-domain:default-project:Public
251 public_ip_range: 185.22.97.128/26
252 private_ip_range: 10.150.0.0/16
253 service_cluster_ip_range: 10.254.0.0/16
254 network_label: name
255 service_label: uses
256 cluster_service: kube-system/default
257 network_manager:
258 image: pupapaik/opencontrail-kube-network-manager
259 tag: release-1.1-jpa-final-1
260
261On pools:
262
263.. code-block:: yaml
264
265 kubernetes:
266 pool:
267 network:
268 engine: opencontrail
269
Jakub Pavlik1cfc1fe2016-07-25 11:01:52 +0200270Kubernetes control plane running in systemd
271-------------------------------------------
272
Matthew Mosesohnbf9d3fb2017-05-17 16:17:02 +0300273By default kube-apiserver, kube-scheduler, kube-controllermanager, kube-proxy, etcd running in docker containers through manifests. For stable production environment this should be run in systemd.
Jakub Pavlik1cfc1fe2016-07-25 11:01:52 +0200274
275.. code-block:: yaml
276
277 kubernetes:
278 master:
279 container: false
280
281 kubernetes:
282 pool:
283 container: false
284
marco055ff852016-07-27 15:22:33 +0200285Because k8s services run under kube user without root privileges, there is need to change secure port for apiserver.
286
287.. code-block:: yaml
288
289 kubernetes:
290 master:
291 apiserver:
292 secure_port: 8081
293
marcoacdae7e2015-12-02 15:35:37 +0100294Kubernetes with Flannel
295-----------------------
296
297On Master:
298
299.. code-block:: yaml
300
301 kubernetes:
302 master:
303 network:
304 engine: flannel
Jakub Pavlik7e985322016-07-17 13:16:15 +0200305 # If you don't register master as node:
marcoa05621f2016-07-14 10:35:24 +0200306 etcd:
307 members:
308 - host: 10.0.175.101
309 port: 4001
310 - host: 10.0.175.102
311 port: 4001
312 - host: 10.0.175.103
313 port: 4001
marcoacdae7e2015-12-02 15:35:37 +0100314 common:
315 network:
316 engine: flannel
317
318On pools:
319
320.. code-block:: yaml
321
322 kubernetes:
323 pool:
324 network:
325 engine: flannel
marcoa05621f2016-07-14 10:35:24 +0200326 etcd:
327 members:
328 - host: 10.0.175.101
329 port: 4001
330 - host: 10.0.175.102
331 port: 4001
332 - host: 10.0.175.103
333 port: 4001
marcoacdae7e2015-12-02 15:35:37 +0100334 common:
335 network:
336 engine: flannel
337
338Kubernetes with Calico
339-----------------------
340
341On Master:
342
343.. code-block:: yaml
344
345 kubernetes:
346 master:
347 network:
348 engine: calico
Jakub Pavlik7e985322016-07-17 13:16:15 +0200349 # If you don't register master as node:
marcoa05621f2016-07-14 10:35:24 +0200350 etcd:
351 members:
352 - host: 10.0.175.101
353 port: 4001
354 - host: 10.0.175.102
355 port: 4001
356 - host: 10.0.175.103
357 port: 4001
marcoacdae7e2015-12-02 15:35:37 +0100358
359On pools:
360
361.. code-block:: yaml
362
363 kubernetes:
364 pool:
365 network:
366 engine: calico
marcoa05621f2016-07-14 10:35:24 +0200367 etcd:
368 members:
369 - host: 10.0.175.101
370 port: 4001
371 - host: 10.0.175.102
372 port: 4001
373 - host: 10.0.175.103
374 port: 4001
marcoacdae7e2015-12-02 15:35:37 +0100375
Tomáš Kukrál34c59362017-03-01 14:00:37 +0100376Running with secured etcd:
377
378.. code-block:: yaml
379
380 kubernetes:
381 pool:
382 network:
383 engine: calico
384 etcd:
385 ssl:
386 enabled: true
387 master:
388 network:
389 engine: calico
390 etcd:
391 ssl:
392 enabled: true
393
Matthew Mosesohnbf9d3fb2017-05-17 16:17:02 +0300394Running with calico-policy controller:
395
396.. code-block:: yaml
397
398 kubernetes:
399 pool:
400 network:
401 engine: calico
402 addons:
403 calico_policy:
404 enabled: true
405
406 master:
407 network:
408 engine: calico
409 addons:
410 calico_policy:
411 enabled: true
412
413
414
Tomáš Kukrál7e91a942017-03-23 16:02:52 +0100415Enable Prometheus metrics in Felix
416
417.. code-block:: yaml
418
419 kubernetes:
420 pool:
421 network:
422 prometheus:
423 enabled: true
424 master:
425 network:
426 prometheus:
427 enabled: true
428
Jakub Pavlik7e985322016-07-17 13:16:15 +0200429Post deployment configuration
430
431.. code-block:: bash
Jakub Pavlik232833c2016-07-17 13:21:00 +0200432
Jakub Pavlik7e985322016-07-17 13:16:15 +0200433 # set ETCD
434 export ETCD_AUTHORITY=10.0.111.201:4001
435
436 # Set NAT for pods subnet
437 calicoctl pool add 192.168.0.0/16 --nat-outgoing
438
439 # Status commands
440 calicoctl status
441 calicoctl node show
442
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200443Kubernetes with GlusterFS for storage
444---------------------------------------------
445
446.. code-block:: yaml
447
448 kubernetes:
Tomáš Kukrál4f0dae32017-03-21 19:04:19 +0100449 master:
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200450 ...
451 storage:
452 engine: glusterfs
453 port: 24007
454 members:
455 - host: 10.0.175.101
456 port: 24007
457 - host: 10.0.175.102
458 port: 24007
459 - host: 10.0.175.103
460 port: 24007
461 ...
462
marco45fc1b72016-07-02 16:11:18 +0200463Kubernetes namespaces
464---------------------
465
466Create namespace:
467
468.. code-block:: yaml
469
470 kubernetes:
Tomáš Kukrál4f0dae32017-03-21 19:04:19 +0100471 master:
marco45fc1b72016-07-02 16:11:18 +0200472 ...
473 namespace:
474 kube-system:
475 enabled: True
476 namespace2:
477 enabled: True
478 namespace3:
479 enabled: False
480 ...
481
482Kubernetes labels
483-----------------
484
Marek Celoud901020b2017-01-27 14:51:41 +0100485Label node:
marco45fc1b72016-07-02 16:11:18 +0200486
487.. code-block:: yaml
488
Marek Celoud901020b2017-01-27 14:51:41 +0100489 kubernetes:
490 master:
491 label:
492 label01:
493 value: value01
494 node: node01
495 enabled: true
496 key: key01
marco45fc1b72016-07-02 16:11:18 +0200497 ...
marco45fc1b72016-07-02 16:11:18 +0200498
marcof7efecb2016-07-16 16:13:37 +0200499Pull images from private registries
500-----------------------------------
501
502.. code-block:: yaml
503
504 kubernetes:
Tomáš Kukrál4f0dae32017-03-21 19:04:19 +0100505 master:
marcof7efecb2016-07-16 16:13:37 +0200506 ...
507 registry:
508 secret:
509 registry01:
510 enabled: True
511 key: (get from `cat /root/.docker/config.json | base64`)
512 namespace: default
513 ...
514 control:
515 ...
516 service:
517 service01:
518 ...
519 image_pull_secretes: registry01
520 ...
521
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200522Kubernetes Service Definitions in pillars
523==========================================
524
525Following samples show how to generate kubernetes manifest as well and provide single tool for complete infrastructure management.
526
527Deployment manifest
528---------------------
marcoacdae7e2015-12-02 15:35:37 +0100529
530.. code-block:: yaml
531
532 salt:
533 control:
534 enabled: True
535 hostNetwork: True
536 service:
537 memcached:
538 privileged: True
539 service: memcached
540 role: server
541 type: LoadBalancer
542 replicas: 3
543 kind: Deployment
544 apiVersion: extensions/v1beta1
545 ports:
546 - port: 8774
547 name: nova-api
548 - port: 8775
549 name: nova-metadata
550 volume:
551 volume_name:
552 type: hostPath
553 mount: /certs
554 path: /etc/certs
555 container:
556 memcached:
557 image: memcached
558 tag:2
559 ports:
560 - port: 8774
561 name: nova-api
562 - port: 8775
563 name: nova-metadata
564 variables:
565 - name: HTTP_TLS_CERTIFICATE:
566 value: /certs/domain.crt
567 - name: HTTP_TLS_KEY
568 value: /certs/domain.key
569 volumes:
570 - name: /etc/certs
571 type: hostPath
572 mount: /certs
573 path: /etc/certs
574
marcobe30c8d2016-10-11 19:16:35 +0200575PetSet manifest
576---------------------
577
578.. code-block:: yaml
579
580 service:
581 memcached:
582 apiVersion: apps/v1alpha1
583 kind: PetSet
584 service_name: 'memcached'
585 container:
586 memcached:
587 ...
588
589
Filip Pytloun9a4a40f2016-09-22 16:28:19 +0200590Configmap
591---------
592
593You are able to create configmaps using support layer between formulas.
594It works simple, eg. in nova formula there's file ``meta/config.yml`` which
595defines config files used by that service and roles.
596
597Kubernetes formula is able to generate these files using custom pillar and
598grains structure. This way you are able to run docker images built by any way
599while still re-using your configuration management.
600
601Example pillar:
602
603.. code-block:: bash
604
605 kubernetes:
606 control:
Jakub Pavlika2779722016-11-25 15:35:26 +0100607 config_type: default|kubernetes # Output is yaml k8s or default single files
Filip Pytloun9a4a40f2016-09-22 16:28:19 +0200608 configmap:
609 nova-control:
610 grains:
611 # Alternate grains as OS running in container may differ from
612 # salt minion OS. Needed only if grains matters for config
613 # generation.
614 os_family: Debian
615 pillar:
616 # Generic pillar for nova controller
617 nova:
618 controller:
619 enabled: true
620 versionn: liberty
621 ...
622
623To tell which services supports config generation, you need to ensure pillar
624structure like this to determine support:
625
626.. code-block:: yaml
627
628 nova:
629 _support:
630 config:
631 enabled: true
632
marcod4d3dbd2016-09-27 11:36:40 +0200633initContainers
634--------------
635
636Example pillar:
637
638.. code-block:: bash
639
640 kubernetes:
641 control:
642 service:
643 memcached:
644 init_containers:
645 - name: test-mysql
646 image: busybox
647 command:
648 - sleep
649 - 3600
650 volumes:
651 - name: config
652 mount: /test
653 - name: test-memcached
654 image: busybox
655 command:
656 - sleep
657 - 3600
658 volumes:
659 - name: config
660 mount: /test
661
marcoee859d32016-11-07 11:04:57 +0100662Affinity
663--------
664
665podAffinity
666===========
667
668Example pillar:
669
670.. code-block:: bash
671
672 kubernetes:
673 control:
674 service:
675 memcached:
676 affinity:
677 pod_affinity:
678 name: podAffinity
679 expression:
680 label_selector:
681 name: labelSelector
682 selectors:
683 - key: app
684 value: memcached
685 topology_key: kubernetes.io/hostname
686
687podAntiAffinity
688===============
689
690Example pillar:
691
692.. code-block:: bash
693
694 kubernetes:
695 control:
696 service:
697 memcached:
698 affinity:
699 anti_affinity:
700 name: podAntiAffinity
701 expression:
702 label_selector:
703 name: labelSelector
704 selectors:
705 - key: app
706 value: opencontrail-control
707 topology_key: kubernetes.io/hostname
708
709nodeAffinity
710===============
711
712Example pillar:
713
714.. code-block:: bash
715
716 kubernetes:
717 control:
718 service:
719 memcached:
720 affinity:
721 node_affinity:
722 name: nodeAffinity
723 expression:
724 match_expressions:
725 name: matchExpressions
726 selectors:
727 - key: key
728 operator: In
729 values:
730 - value1
731 - value2
732
marcoacdae7e2015-12-02 15:35:37 +0100733Volumes
734-------
735
736hostPath
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200737==========
marcoacdae7e2015-12-02 15:35:37 +0100738
739.. code-block:: yaml
740
marcob469f882016-09-27 09:56:13 +0200741 service:
marcoacdae7e2015-12-02 15:35:37 +0100742 memcached:
marcob469f882016-09-27 09:56:13 +0200743 container:
744 memcached:
745 volumes:
746 - name: volume1
747 mountPath: /volume
748 readOnly: True
marcoacdae7e2015-12-02 15:35:37 +0100749 ...
marcob469f882016-09-27 09:56:13 +0200750 volume:
751 volume1:
752 name: /etc/certs
753 type: hostPath
754 path: /etc/certs
marcoacdae7e2015-12-02 15:35:37 +0100755
756emptyDir
Ales Komarek688a04c2016-07-15 15:12:30 +0200757========
marcoacdae7e2015-12-02 15:35:37 +0100758
759.. code-block:: yaml
760
marcob469f882016-09-27 09:56:13 +0200761 service:
marcoacdae7e2015-12-02 15:35:37 +0100762 memcached:
marcob469f882016-09-27 09:56:13 +0200763 container:
764 memcached:
765 volumes:
766 - name: volume1
767 mountPath: /volume
768 readOnly: True
marcoacdae7e2015-12-02 15:35:37 +0100769 ...
marcob469f882016-09-27 09:56:13 +0200770 volume:
771 volume1:
772 name: /etc/certs
773 type: emptyDir
774
775configMap
776=========
777
778.. code-block:: yaml
779
780 service:
781 memcached:
782 container:
783 memcached:
784 volumes:
785 - name: volume1
786 mountPath: /volume
787 readOnly: True
788 ...
789 volume:
790 volume1:
791 type: config_map
792 item:
793 configMap1:
794 key: config.conf
795 path: config.conf
796 configMap2:
797 key: policy.json
798 path: policy.json
Jakub Pavlik27ad3a62016-08-05 11:39:45 +0200799
marco0eda4fb2016-10-10 19:08:27 +0200800To mount single configuration file instead of whole directory:
801
802.. code-block:: yaml
803
804 service:
805 memcached:
806 container:
807 memcached:
808 volumes:
809 - name: volume1
810 mountPath: /volume/config.conf
811 sub_path: config.conf
812
marcofcc20d02016-10-10 09:56:12 +0200813Generating Jobs
814===============
815
816Example pillar:
817
818.. code-block:: yaml
819
820 kubernetes:
821 control:
822 job:
823 sleep:
824 job: sleep
825 restart_policy: Never
826 container:
827 sleep:
828 image: busybox
829 tag: latest
830 command:
831 - sleep
832 - "3600"
833
834Volumes and Variables can be used as the same way as during Deployment generation.
835
836Custom params:
837
838.. code-block:: yaml
839
840 kubernetes:
841 control:
842 job:
843 host_network: True
844 host_pid: True
845 container:
846 sleep:
847 privileged: True
848 node_selector:
849 key: node
850 value: one
851 image_pull_secretes: password
852
Jakub Pavlik27ad3a62016-08-05 11:39:45 +0200853Documentation and Bugs
Filip Pytloun06a55402016-08-12 14:53:30 +0200854======================
Jakub Pavlik27ad3a62016-08-05 11:39:45 +0200855
856To learn how to deploy OpenStack Salt, consult the documentation available
857online at:
858
859 https://wiki.openstack.org/wiki/OpenStackSalt
860
861In the unfortunate event that bugs are discovered, they should be reported to
862the appropriate bug tracker. If you obtained the software from a 3rd party
863operating system vendor, it is often wise to use their own bug tracker for
864reporting problems. In all other cases use the master OpenStack bug tracker,
865available at:
866
867 http://bugs.launchpad.net/openstack-salt
868
869Developers wishing to work on the OpenStack Salt project should always base
870their work on the latest formulas code, available from the master GIT
871repository at:
872
873 https://git.openstack.org/cgit/openstack/salt-formula-kubernetes
874
875Developers should also join the discussion on the IRC list, at:
876
877 https://wiki.openstack.org/wiki/Meetings/openstack-salt
Filip Pytloun06a55402016-08-12 14:53:30 +0200878
879Copyright and authors
880=====================
881
882(c) 2016 tcp cloud a.s.
883(c) 2016 OpenStack Foundation
Filip Pytlound06f6272017-02-02 13:02:03 +0100884
885Documentation and Bugs
886======================
887
888To learn how to install and update salt-formulas, consult the documentation
889available online at:
890
891 http://salt-formulas.readthedocs.io/
892
893In the unfortunate event that bugs are discovered, they should be reported to
894the appropriate issue tracker. Use Github issue tracker for specific salt
895formula:
896
897 https://github.com/salt-formulas/salt-formula-kubernetes/issues
898
899For feature requests, bug reports or blueprints affecting entire ecosystem,
900use Launchpad salt-formulas project:
901
902 https://launchpad.net/salt-formulas
903
904You can also join salt-formulas-users team and subscribe to mailing list:
905
906 https://launchpad.net/~salt-formulas-users
907
908Developers wishing to work on the salt-formulas projects should always base
909their work on master branch and submit pull request against specific formula.
910
911 https://github.com/salt-formulas/salt-formula-kubernetes
912
913Any questions or feedback is always welcome so feel free to join our IRC
914channel:
915
916 #salt-formulas @ irc.freenode.net