blob: f624f810cb7a3d17ee3de52d562c229ab087968c [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
Tomáš Kukrálbc3623e2017-03-23 18:24:06 +0100235
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200236Kubernetes with OpenContrail network plugin
237------------------------------------------------
marcoacdae7e2015-12-02 15:35:37 +0100238
239On Master:
240
241.. code-block:: yaml
242
243 kubernetes:
244 master:
245 network:
246 engine: opencontrail
247 host: 10.0.170.70
248 port: 8082
249 default_domain: default-domain
250 default_project: default-domain:default-project
251 public_network: default-domain:default-project:Public
252 public_ip_range: 185.22.97.128/26
253 private_ip_range: 10.150.0.0/16
254 service_cluster_ip_range: 10.254.0.0/16
255 network_label: name
256 service_label: uses
257 cluster_service: kube-system/default
258 network_manager:
259 image: pupapaik/opencontrail-kube-network-manager
260 tag: release-1.1-jpa-final-1
261
262On pools:
263
264.. code-block:: yaml
265
266 kubernetes:
267 pool:
268 network:
269 engine: opencontrail
270
Jakub Pavlik1cfc1fe2016-07-25 11:01:52 +0200271Kubernetes control plane running in systemd
272-------------------------------------------
273
Matthew Mosesohnbf9d3fb2017-05-17 16:17:02 +0300274By 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 +0200275
276.. code-block:: yaml
277
278 kubernetes:
279 master:
280 container: false
281
282 kubernetes:
283 pool:
284 container: false
285
marco055ff852016-07-27 15:22:33 +0200286Because k8s services run under kube user without root privileges, there is need to change secure port for apiserver.
287
288.. code-block:: yaml
289
290 kubernetes:
291 master:
292 apiserver:
293 secure_port: 8081
294
marcoacdae7e2015-12-02 15:35:37 +0100295Kubernetes with Flannel
296-----------------------
297
298On Master:
299
300.. code-block:: yaml
301
302 kubernetes:
303 master:
304 network:
305 engine: flannel
Jakub Pavlik7e985322016-07-17 13:16:15 +0200306 # If you don't register master as node:
marcoa05621f2016-07-14 10:35:24 +0200307 etcd:
308 members:
309 - host: 10.0.175.101
310 port: 4001
311 - host: 10.0.175.102
312 port: 4001
313 - host: 10.0.175.103
314 port: 4001
marcoacdae7e2015-12-02 15:35:37 +0100315 common:
316 network:
317 engine: flannel
318
319On pools:
320
321.. code-block:: yaml
322
323 kubernetes:
324 pool:
325 network:
326 engine: flannel
marcoa05621f2016-07-14 10:35:24 +0200327 etcd:
328 members:
329 - host: 10.0.175.101
330 port: 4001
331 - host: 10.0.175.102
332 port: 4001
333 - host: 10.0.175.103
334 port: 4001
marcoacdae7e2015-12-02 15:35:37 +0100335 common:
336 network:
337 engine: flannel
338
339Kubernetes with Calico
340-----------------------
341
342On Master:
343
344.. code-block:: yaml
345
346 kubernetes:
347 master:
348 network:
349 engine: calico
Jakub Pavlik7e985322016-07-17 13:16:15 +0200350 # If you don't register master as node:
marcoa05621f2016-07-14 10:35:24 +0200351 etcd:
352 members:
353 - host: 10.0.175.101
354 port: 4001
355 - host: 10.0.175.102
356 port: 4001
357 - host: 10.0.175.103
358 port: 4001
marcoacdae7e2015-12-02 15:35:37 +0100359
360On pools:
361
362.. code-block:: yaml
363
364 kubernetes:
365 pool:
366 network:
367 engine: calico
marcoa05621f2016-07-14 10:35:24 +0200368 etcd:
369 members:
370 - host: 10.0.175.101
371 port: 4001
372 - host: 10.0.175.102
373 port: 4001
374 - host: 10.0.175.103
375 port: 4001
marcoacdae7e2015-12-02 15:35:37 +0100376
Tomáš Kukrál34c59362017-03-01 14:00:37 +0100377Running with secured etcd:
378
379.. code-block:: yaml
380
381 kubernetes:
382 pool:
383 network:
384 engine: calico
385 etcd:
386 ssl:
387 enabled: true
388 master:
389 network:
390 engine: calico
391 etcd:
392 ssl:
393 enabled: true
394
Matthew Mosesohnbf9d3fb2017-05-17 16:17:02 +0300395Running with calico-policy controller:
396
397.. code-block:: yaml
398
399 kubernetes:
400 pool:
401 network:
402 engine: calico
403 addons:
404 calico_policy:
405 enabled: true
406
407 master:
408 network:
409 engine: calico
410 addons:
411 calico_policy:
412 enabled: true
413
414
415
Tomáš Kukrál7e91a942017-03-23 16:02:52 +0100416Enable Prometheus metrics in Felix
417
418.. code-block:: yaml
419
420 kubernetes:
421 pool:
422 network:
423 prometheus:
424 enabled: true
425 master:
426 network:
427 prometheus:
428 enabled: true
429
Jakub Pavlik7e985322016-07-17 13:16:15 +0200430Post deployment configuration
431
432.. code-block:: bash
Jakub Pavlik232833c2016-07-17 13:21:00 +0200433
Jakub Pavlik7e985322016-07-17 13:16:15 +0200434 # set ETCD
435 export ETCD_AUTHORITY=10.0.111.201:4001
436
437 # Set NAT for pods subnet
438 calicoctl pool add 192.168.0.0/16 --nat-outgoing
439
440 # Status commands
441 calicoctl status
442 calicoctl node show
443
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200444Kubernetes with GlusterFS for storage
445---------------------------------------------
446
447.. code-block:: yaml
448
449 kubernetes:
Tomáš Kukrál4f0dae32017-03-21 19:04:19 +0100450 master:
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200451 ...
452 storage:
453 engine: glusterfs
454 port: 24007
455 members:
456 - host: 10.0.175.101
457 port: 24007
458 - host: 10.0.175.102
459 port: 24007
460 - host: 10.0.175.103
461 port: 24007
462 ...
463
marco45fc1b72016-07-02 16:11:18 +0200464Kubernetes namespaces
465---------------------
466
467Create namespace:
468
469.. code-block:: yaml
470
471 kubernetes:
Tomáš Kukrál4f0dae32017-03-21 19:04:19 +0100472 master:
marco45fc1b72016-07-02 16:11:18 +0200473 ...
474 namespace:
475 kube-system:
476 enabled: True
477 namespace2:
478 enabled: True
479 namespace3:
480 enabled: False
481 ...
482
483Kubernetes labels
484-----------------
485
Marek Celoud901020b2017-01-27 14:51:41 +0100486Label node:
marco45fc1b72016-07-02 16:11:18 +0200487
488.. code-block:: yaml
489
Marek Celoud901020b2017-01-27 14:51:41 +0100490 kubernetes:
491 master:
492 label:
493 label01:
494 value: value01
495 node: node01
496 enabled: true
497 key: key01
marco45fc1b72016-07-02 16:11:18 +0200498 ...
marco45fc1b72016-07-02 16:11:18 +0200499
marcof7efecb2016-07-16 16:13:37 +0200500Pull images from private registries
501-----------------------------------
502
503.. code-block:: yaml
504
505 kubernetes:
Tomáš Kukrál4f0dae32017-03-21 19:04:19 +0100506 master:
marcof7efecb2016-07-16 16:13:37 +0200507 ...
508 registry:
509 secret:
510 registry01:
511 enabled: True
512 key: (get from `cat /root/.docker/config.json | base64`)
513 namespace: default
514 ...
515 control:
516 ...
517 service:
518 service01:
519 ...
520 image_pull_secretes: registry01
521 ...
522
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200523Kubernetes Service Definitions in pillars
524==========================================
525
526Following samples show how to generate kubernetes manifest as well and provide single tool for complete infrastructure management.
527
528Deployment manifest
529---------------------
marcoacdae7e2015-12-02 15:35:37 +0100530
531.. code-block:: yaml
532
533 salt:
534 control:
535 enabled: True
536 hostNetwork: True
537 service:
538 memcached:
539 privileged: True
540 service: memcached
541 role: server
542 type: LoadBalancer
543 replicas: 3
544 kind: Deployment
545 apiVersion: extensions/v1beta1
546 ports:
547 - port: 8774
548 name: nova-api
549 - port: 8775
550 name: nova-metadata
551 volume:
552 volume_name:
553 type: hostPath
554 mount: /certs
555 path: /etc/certs
556 container:
557 memcached:
558 image: memcached
559 tag:2
560 ports:
561 - port: 8774
562 name: nova-api
563 - port: 8775
564 name: nova-metadata
565 variables:
566 - name: HTTP_TLS_CERTIFICATE:
567 value: /certs/domain.crt
568 - name: HTTP_TLS_KEY
569 value: /certs/domain.key
570 volumes:
571 - name: /etc/certs
572 type: hostPath
573 mount: /certs
574 path: /etc/certs
575
marcobe30c8d2016-10-11 19:16:35 +0200576PetSet manifest
577---------------------
578
579.. code-block:: yaml
580
581 service:
582 memcached:
583 apiVersion: apps/v1alpha1
584 kind: PetSet
585 service_name: 'memcached'
586 container:
587 memcached:
588 ...
589
590
Filip Pytloun9a4a40f2016-09-22 16:28:19 +0200591Configmap
592---------
593
594You are able to create configmaps using support layer between formulas.
595It works simple, eg. in nova formula there's file ``meta/config.yml`` which
596defines config files used by that service and roles.
597
598Kubernetes formula is able to generate these files using custom pillar and
599grains structure. This way you are able to run docker images built by any way
600while still re-using your configuration management.
601
602Example pillar:
603
604.. code-block:: bash
605
606 kubernetes:
607 control:
Jakub Pavlika2779722016-11-25 15:35:26 +0100608 config_type: default|kubernetes # Output is yaml k8s or default single files
Filip Pytloun9a4a40f2016-09-22 16:28:19 +0200609 configmap:
610 nova-control:
611 grains:
612 # Alternate grains as OS running in container may differ from
613 # salt minion OS. Needed only if grains matters for config
614 # generation.
615 os_family: Debian
616 pillar:
617 # Generic pillar for nova controller
618 nova:
619 controller:
620 enabled: true
621 versionn: liberty
622 ...
623
624To tell which services supports config generation, you need to ensure pillar
625structure like this to determine support:
626
627.. code-block:: yaml
628
629 nova:
630 _support:
631 config:
632 enabled: true
633
marcod4d3dbd2016-09-27 11:36:40 +0200634initContainers
635--------------
636
637Example pillar:
638
639.. code-block:: bash
640
641 kubernetes:
642 control:
643 service:
644 memcached:
645 init_containers:
646 - name: test-mysql
647 image: busybox
648 command:
649 - sleep
650 - 3600
651 volumes:
652 - name: config
653 mount: /test
654 - name: test-memcached
655 image: busybox
656 command:
657 - sleep
658 - 3600
659 volumes:
660 - name: config
661 mount: /test
662
marcoee859d32016-11-07 11:04:57 +0100663Affinity
664--------
665
666podAffinity
667===========
668
669Example pillar:
670
671.. code-block:: bash
672
673 kubernetes:
674 control:
675 service:
676 memcached:
677 affinity:
678 pod_affinity:
679 name: podAffinity
680 expression:
681 label_selector:
682 name: labelSelector
683 selectors:
684 - key: app
685 value: memcached
686 topology_key: kubernetes.io/hostname
687
688podAntiAffinity
689===============
690
691Example pillar:
692
693.. code-block:: bash
694
695 kubernetes:
696 control:
697 service:
698 memcached:
699 affinity:
700 anti_affinity:
701 name: podAntiAffinity
702 expression:
703 label_selector:
704 name: labelSelector
705 selectors:
706 - key: app
707 value: opencontrail-control
708 topology_key: kubernetes.io/hostname
709
710nodeAffinity
711===============
712
713Example pillar:
714
715.. code-block:: bash
716
717 kubernetes:
718 control:
719 service:
720 memcached:
721 affinity:
722 node_affinity:
723 name: nodeAffinity
724 expression:
725 match_expressions:
726 name: matchExpressions
727 selectors:
728 - key: key
729 operator: In
730 values:
731 - value1
732 - value2
733
marcoacdae7e2015-12-02 15:35:37 +0100734Volumes
735-------
736
737hostPath
Jakub Pavlik495d06f2016-06-17 11:33:05 +0200738==========
marcoacdae7e2015-12-02 15:35:37 +0100739
740.. code-block:: yaml
741
marcob469f882016-09-27 09:56:13 +0200742 service:
marcoacdae7e2015-12-02 15:35:37 +0100743 memcached:
marcob469f882016-09-27 09:56:13 +0200744 container:
745 memcached:
746 volumes:
747 - name: volume1
748 mountPath: /volume
749 readOnly: True
marcoacdae7e2015-12-02 15:35:37 +0100750 ...
marcob469f882016-09-27 09:56:13 +0200751 volume:
752 volume1:
753 name: /etc/certs
754 type: hostPath
755 path: /etc/certs
marcoacdae7e2015-12-02 15:35:37 +0100756
757emptyDir
Ales Komarek688a04c2016-07-15 15:12:30 +0200758========
marcoacdae7e2015-12-02 15:35:37 +0100759
760.. code-block:: yaml
761
marcob469f882016-09-27 09:56:13 +0200762 service:
marcoacdae7e2015-12-02 15:35:37 +0100763 memcached:
marcob469f882016-09-27 09:56:13 +0200764 container:
765 memcached:
766 volumes:
767 - name: volume1
768 mountPath: /volume
769 readOnly: True
marcoacdae7e2015-12-02 15:35:37 +0100770 ...
marcob469f882016-09-27 09:56:13 +0200771 volume:
772 volume1:
773 name: /etc/certs
774 type: emptyDir
775
776configMap
777=========
778
779.. code-block:: yaml
780
781 service:
782 memcached:
783 container:
784 memcached:
785 volumes:
786 - name: volume1
787 mountPath: /volume
788 readOnly: True
789 ...
790 volume:
791 volume1:
792 type: config_map
793 item:
794 configMap1:
795 key: config.conf
796 path: config.conf
797 configMap2:
798 key: policy.json
799 path: policy.json
Jakub Pavlik27ad3a62016-08-05 11:39:45 +0200800
marco0eda4fb2016-10-10 19:08:27 +0200801To mount single configuration file instead of whole directory:
802
803.. code-block:: yaml
804
805 service:
806 memcached:
807 container:
808 memcached:
809 volumes:
810 - name: volume1
811 mountPath: /volume/config.conf
812 sub_path: config.conf
813
marcofcc20d02016-10-10 09:56:12 +0200814Generating Jobs
815===============
816
817Example pillar:
818
819.. code-block:: yaml
820
821 kubernetes:
822 control:
823 job:
824 sleep:
825 job: sleep
826 restart_policy: Never
827 container:
828 sleep:
829 image: busybox
830 tag: latest
831 command:
832 - sleep
833 - "3600"
834
835Volumes and Variables can be used as the same way as during Deployment generation.
836
837Custom params:
838
839.. code-block:: yaml
840
841 kubernetes:
842 control:
843 job:
844 host_network: True
845 host_pid: True
846 container:
847 sleep:
848 privileged: True
849 node_selector:
850 key: node
851 value: one
852 image_pull_secretes: password
853
Jakub Pavlik27ad3a62016-08-05 11:39:45 +0200854Documentation and Bugs
Filip Pytloun06a55402016-08-12 14:53:30 +0200855======================
Jakub Pavlik27ad3a62016-08-05 11:39:45 +0200856
857To learn how to deploy OpenStack Salt, consult the documentation available
858online at:
859
860 https://wiki.openstack.org/wiki/OpenStackSalt
861
862In the unfortunate event that bugs are discovered, they should be reported to
863the appropriate bug tracker. If you obtained the software from a 3rd party
864operating system vendor, it is often wise to use their own bug tracker for
865reporting problems. In all other cases use the master OpenStack bug tracker,
866available at:
867
868 http://bugs.launchpad.net/openstack-salt
869
870Developers wishing to work on the OpenStack Salt project should always base
871their work on the latest formulas code, available from the master GIT
872repository at:
873
874 https://git.openstack.org/cgit/openstack/salt-formula-kubernetes
875
876Developers should also join the discussion on the IRC list, at:
877
878 https://wiki.openstack.org/wiki/Meetings/openstack-salt
Filip Pytloun06a55402016-08-12 14:53:30 +0200879
880Copyright and authors
881=====================
882
883(c) 2016 tcp cloud a.s.
884(c) 2016 OpenStack Foundation
Filip Pytlound06f6272017-02-02 13:02:03 +0100885
886Documentation and Bugs
887======================
888
889To learn how to install and update salt-formulas, consult the documentation
890available online at:
891
892 http://salt-formulas.readthedocs.io/
893
894In the unfortunate event that bugs are discovered, they should be reported to
895the appropriate issue tracker. Use Github issue tracker for specific salt
896formula:
897
898 https://github.com/salt-formulas/salt-formula-kubernetes/issues
899
900For feature requests, bug reports or blueprints affecting entire ecosystem,
901use Launchpad salt-formulas project:
902
903 https://launchpad.net/salt-formulas
904
905You can also join salt-formulas-users team and subscribe to mailing list:
906
907 https://launchpad.net/~salt-formulas-users
908
909Developers wishing to work on the salt-formulas projects should always base
910their work on master branch and submit pull request against specific formula.
911
912 https://github.com/salt-formulas/salt-formula-kubernetes
913
914Any questions or feedback is always welcome so feel free to join our IRC
915channel:
916
917 #salt-formulas @ irc.freenode.net