0a28a87e6dc1f6b7d42ca52584d052ca42dc92fb
[integration/packaging.git] / helm / README.md
1 # OpenDaylight Helm Chart
2
3 OpenDaylight Helm Chart is a packaging for kubernetes deployment.
4 The composition of this chart consist of statefulset that can scale to multiple standalone instances of OpenDaylight Pods.
5
6 ## Customization
7
8 Before deploying, there are several areas can be customized.
9 Either by editing values.yaml or using --set flag pass-in with the helm command 
10 e.g
11 ```
12 helm install sdnc opendaylight --set persistence.enabled=true
13 ```
14
15 ### Java Memory and GC settings
16
17 In values.yaml, java max memory and GC settings can be customized
18
19 ```
20   javaOptions:
21     maxGCPauseMillis: 100
22     parallelGCThreads : 3
23     numberGCLogFiles: 10
24     minMemory: 512m
25     maxMemory: 2048m
26     gcLogOptions: ""
27 ```
28
29 ### OpenDaylight Features
30
31 In values.yaml, one can customize features to be included during instance startup.  By default, only restconf is included.
32
33 ```
34 config:
35   odl_basedir: /opt/opendaylight
36   #features: odl-restconf,odl-restconf-all,odl-bgpcep-pcep,odl-bgpcep-bgp,odl-bgpcep-bgp-config-example,odl-bgpcep-bmp,odl-bgpcep-bmp-config-example,odl-jolokiaa,odl-daexim-all
37   features: odl-restconf,odl-restconf-all
38 ```
39
40 ### Container Image Version
41
42 The pull policy can be customized in values.yaml.
43
44 ```
45 image:
46   repository: nexus3.opendaylight.org:10001/opendaylight/opendaylight
47   pullPolicy: IfNotPresent
48 ```
49
50 The container image version is located in Chart.yaml
51 ```
52 appVersion: "14.2.0"
53 ```
54 so the combined image from above two files will be:
55 `nexus3.opendaylight.org:10001/opendaylight:14.2.0`
56
57 ### Persistent Volume
58
59 By default the OpenDaylight Pod uses ephemeral volume.
60 The data stored at /data will lost after container restarts.
61
62 To support data persistence, it requires kubernetes persistent storageClass.  Depend on your environment, there are many implementation of storage plugin.  Following is example of define a storageClass on OpenEBS storage plugin.
63
64 create storageClass vg01-lvmpv for OpenEBS on volume group vg01
65 ```
66 kubectl apply -f - <<EOD
67 apiVersion: storage.k8s.io/v1
68 kind: StorageClass
69 metadata:
70   name: vg01-lvmpv
71 allowVolumeExpansion: true
72 parameters:
73    volgroup: "vg01"
74 provisioner: local.csi.openebs.io
75 EOD
76 ```
77
78 Once storageClass is defined, adjust the values.yaml
79 - enabled = true
80 - size = `adjustable based on number of devices supported`
81 - storageClass = `defined storageClass`
82 ```
83 persistence:
84   enabled: false
85   accessMode: ReadWriteOnce
86   size: 5Gi
87   mountPath: /data
88   storageClass: vg01-lvmpv
89   volName: odlvol
90 ```
91
92 ### Dry run
93 the generated definition can be inspected before actual deployment using --dry-run flag
94 ```
95 helm install sdnc opendaylight --dry-run 
96 ```
97
98 ## Deploy
99
100 Following will deploy a release called sdnc to default namespace with persistent volume
101 ```
102 helm install sdnc opendaylight --set persistence.enabled=true
103 ```
104
105 if need to deploy on different namespace (sdntest)
106 ```
107 helm install sdnc opendaylight --set persistence.enabled=true --create-namespace -n sdntest
108 ```
109
110
111 the output:
112 ```
113 NAME: sdnc
114 LAST DEPLOYED: Thu Oct 28 12:58:19 2021
115 NAMESPACE: default
116 STATUS: deployed
117 REVISION: 1
118 TEST SUITE: None
119 NOTES:
120 1. Get the application URL by running these commands:
121   export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=opendaylight,app.kubernetes.io/instance=sdnc" -o jsonpath="{.items[0].metadata.name}")
122   export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
123   echo "Visit http://127.0.0.1:8080 to use your application"
124   kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
125 ```
126
127 List deployed charts
128 ```
129 helm list
130
131 NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
132 sdnc    default         1               2021-10-28 12:58:19.548011 -0400 EDT    deployed        opendaylight-0.1.0      14.2.0
133 ```
134
135 Inspect Pods, by default only one instance of OpenDaylight Pods
136 ```
137 kubectl get po
138
139 NAME                  READY   STATUS    RESTARTS   AGE
140 sdnc-opendaylight-0   1/1     Running   0          52s
141
142
143 kubectl get pvc
144
145 NAME                         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
146 odlvol-sdnc-opendaylight-0   Bound    pvc-5d7ece71-088e-4dd6-9fda-67a928a51495   5Gi        RWO            vg01-lvmpv     77s
147 ```
148
149 scale out to 3 standalone opendaylight instance
150 ```
151 kubectl edit statefulset sdnc-opendaylight
152 ```
153
154 update replica from 1 to 3
155 ```
156 spec:
157   podManagementPolicy: OrderedReady
158   replicas: 1
159 ```
160
161 ```
162  kubectl get po
163 NAME                  READY   STATUS    RESTARTS   AGE
164 sdnc-opendaylight-0   1/1     Running   0          6m37s
165 sdnc-opendaylight-1   1/1     Running   0          3m2s
166 sdnc-opendaylight-2   1/1     Running   0          2m20s
167 ```
168
169 uninstall sdnc release
170 ```
171 helm uninstall sdnc
172
173 release "sdnc" uninstalled
174 ```
175
176 the persistent volumes still preserved and can be reuse for next deployment
177 ```
178 kubectl get pvc
179
180 NAME                         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
181 odlvol-sdnc-opendaylight-0   Bound    pvc-5d7ece71-088e-4dd6-9fda-67a928a51495   5Gi        RWO            vg01-lvmpv     10m
182 odlvol-sdnc-opendaylight-1   Bound    pvc-df825859-5970-453b-90df-22eb754a15f8   5Gi        RWO            vg01-lvmpv     6m47s
183 odlvol-sdnc-opendaylight-2   Bound    pvc-e074f280-4393-4b96-b34d-5d6ab22bdf77   5Gi        RWO            vg01-lvmpv     6m5s
184 ```
185
186 ### Access RESTCONF Swagger
187 base on the notes output from heml install, set up port forwarding to first instance
188 ```
189   export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=opendaylight,app.kubernetes.io/instance=sdnc" -o jsonpath="{.items[0].metadata.name}")
190   export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
191   echo "Visit http://127.0.0.1:8080 to use your application"
192   kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
193 ```
194
195 from browser, go to `http://127.0.0.1:8080/apidoc/explorer/index.html` then login with `admin/admin`