Newer
Older
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Service Ordering
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Service Ordering
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../service_ordering/ordering_services/" class="md-nav__link">
<span class="md-ellipsis">
Ordering Services from catalogs
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
<span class="md-ellipsis">
Addons
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Addons
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../addons/intro/" class="md-nav__link">
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_2" >
<label class="md-nav__link" for="__nav_6_2" id="__nav_6_2_label" tabindex="0">
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
<span class="md-ellipsis">
CAMARA
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6_2">
<span class="md-nav__icon md-icon"></span>
CAMARA
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../addons/camara/intro/" class="md-nav__link">
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
<span class="md-ellipsis">
Offering CAMARAaaS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../addons/camara/qod/" class="md-nav__link">
<span class="md-ellipsis">
Quality on Demand
</span>
</a>
</li>
</ul>
</nav>
</li>
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
<li class="md-nav__item">
<a href="../../addons/sylva/" class="md-nav__link">
<span class="md-ellipsis">
LF Sylva
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" checked>
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Design & Architecture
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Design & Architecture
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../architecture/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../messagebus/" class="md-nav__link">
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
<span class="md-ellipsis">
Message bus
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../osom/" class="md-nav__link">
<span class="md-ellipsis">
OSOM
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
CRIDGE
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
CRIDGE
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#introduction" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#approach" class="md-nav__link">
<span class="md-ellipsis">
Approach
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mupliple-clusters-management" class="md-nav__link">
<span class="md-ellipsis">
Mupliple Clusters Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#awareness-for-crds-and-crs-in-a-cluster" class="md-nav__link">
<span class="md-ellipsis">
Awareness for CRDs and CRs in a Cluster
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exposure-of-crds-as-service-specifications" class="md-nav__link">
<span class="md-ellipsis">
Exposure of CRDs as Service Specifications
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#service-orchestration-and-crdscrs" class="md-nav__link">
<span class="md-ellipsis">
Service Orchestration and CRDs/CRs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deployment-of-a-new-cr-based-on-a-crd" class="md-nav__link">
<span class="md-ellipsis">
Deployment of a new CR based on a CRD
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#probe-further" class="md-nav__link">
<span class="md-ellipsis">
Probe further
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../metrico/" class="md-nav__link">
<span class="md-ellipsis">
METRICO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../oauth/" class="md-nav__link">
<span class="md-ellipsis">
Authentication
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7_7" >
<label class="md-nav__link" for="__nav_7_7" id="__nav_7_7_label" tabindex="0">
<span class="md-ellipsis">
APIs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_7_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7_7">
<span class="md-nav__icon md-icon"></span>
APIs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../tmfapi/" class="md-nav__link">
<span class="md-ellipsis">
TMF API
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../nfvapi/" class="md-nav__link">
<span class="md-ellipsis">
NFV API
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../issuemgt/" class="md-nav__link">
<span class="md-ellipsis">
Issue management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../centrallog/" class="md-nav__link">
<span class="md-ellipsis">
Central logging
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Contribute
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Contribute
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../contribute/developing/" class="md-nav__link">
<span class="md-ellipsis">
Developing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../contribute/documenting/" class="md-nav__link">
<span class="md-ellipsis">
Documenting
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../terminology/" class="md-nav__link">
<span class="md-ellipsis">
Terminology
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#introduction" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#approach" class="md-nav__link">
<span class="md-ellipsis">
Approach
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mupliple-clusters-management" class="md-nav__link">
<span class="md-ellipsis">
Mupliple Clusters Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#awareness-for-crds-and-crs-in-a-cluster" class="md-nav__link">
<span class="md-ellipsis">
Awareness for CRDs and CRs in a Cluster
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exposure-of-crds-as-service-specifications" class="md-nav__link">
<span class="md-ellipsis">
Exposure of CRDs as Service Specifications
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#service-orchestration-and-crdscrs" class="md-nav__link">
<span class="md-ellipsis">
Service Orchestration and CRDs/CRs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deployment-of-a-new-cr-based-on-a-crd" class="md-nav__link">
<span class="md-ellipsis">
Deployment of a new CR based on a CRD
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#probe-further" class="md-nav__link">
<span class="md-ellipsis">
Probe further
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
<h1 id="cridge-a-service-to-manage-custom-resources-in-a-kubernetes-cluster">CRIDGE: A Service to manage Custom Resources in a Kubernetes Cluster</h1>
<!-- **Intended Audience: OpenSlice Developers** -->
<h2 id="introduction">Introduction</h2>
<p>Kubernetes is an orchestration system for automating software deployment, scaling, and management. One can interact though the Kubernetes API and it has a set of objects ready for use out of the box. Custom Resource Definitions (CRDs) is a way that allows to manage things other than Kubernetes itself and allows to create our own objects The use of CRDs makes the possibilities of Kubernetes management almost limitless. You can extend the base Kubernetes API with any object you like using CRDs.</p>
<p>CRIDGE is a service designed to create and manage Custom Resources (CRs) based on Custom Resource Definitions (CRDs) installed on a Kubernetes cluster. By leveraging OpenSlice (OSL), CRIDGE enables seamless integration and orchestration within Kubernetes environments, utilizing Kubernetes APIs via the TMF APIs and models. Thus, more or less, OSL exposes Kubernetes APIs as TMF APIs and models.</p>
<p>By allowing the design and lifecycle management of services/resources that expose CRDs/CRs in a Kubernetes cluster via the TMF APIs, OSL can be used in many complex scenarios now involing resources from multiple domains. </p>
<p>Pros, in a nutshell:</p>
<ol>
<li>
<p>CRIDGE service allows OSL to:</p>
<ul>
<li>Create and manage Custom Resources (CRs) using installed CRDs on a target Kubernetes cluster.</li>
<li>Facilitate complex orchestration scenarios by wrapping Kubernetes APIs as TMF APIs and models.</li>
<li>Handles connectivity to a Kubernetes cluster and manages the lifecycle of CRDs</li>
<li>Wraps the Kubernetes API, receives and provides resources towards other OSL services via the service bus</li>
</ul>
</li>
<li>
<p>Enabling Loose Coupling and Orchestration</p>
<ul>
<li>Language Flexibility: Developers can write CRDs in any language and expose them via the Kubernetes APIs. OSL will reuse these CRDs, enhancing flexibility and integration capabilities.</li>
<li>Familiar Deployment: Developers can create and deploy applications using familiar tools such as Helm charts, simplifying the process and reducing the learning curve.</li>
</ul>
</li>
<li>
<p>Ecosystem Reusability</p>
<ul>
<li>CRIDGE capitalizes on the extensive Kubernetes ecosystem, particularly focusing on operators (CRDs).</li>
<li>Key repositories and hubs such as artifacthub.io and Operatorhub.io can be utilized for finding and deploying operators.</li>
</ul>
</li>
<li>
<p>Service Catalog Exposure and Deployment</p>
<p>OSL can expose CRs in service catalogs, facilitating their deployment in complex scenarios.
These scenarios may include service bundles that involve multiple systems, such as RAN controllers or other Kubernetes clusters, providing a robust and versatile deployment framework.</p>
</li>
</ol>
<blockquote>
<p>Why the CRIDGE name? We wanted to build a service that maps TMF models to CRDs; a kind of a <strong>CR</strong>D to TMF br<strong>idge</strong>. Therefore CRIDGE was born.</p>
</blockquote>
<h2 id="approach">Approach</h2>
<blockquote>
<p>OSL in general is responsible for exposing Service Specifications which are ready to be ordered and orchestrated, through TMFORUM Open APIs as defined in the OSL Service Spec Catalog. Usually for a service specification a corresponding (one or more) Resource Specification (resourceSpecificationReference) is registered in the OSL Resource Spec Catalog.</p>
</blockquote>
<p>The following image illustrates the approach.</p>
<p><a class="glightbox" href="../images/cridge/img01.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="img01.png" src="../images/cridge/img01.png" /></a></p>
<ol>
<li>A CRD in a cluster will be mapped in TMF model as a Resource specification and therefore can be exposed as a service specification in a catalog</li>
<li>Service Orders can be created for this service specification. The OSL Orchestrator (OSOM) will manage the lifecycle of the Service Order.</li>
<li>OSOM creates a Resource in OSL Resource inventory and requests (via CRIDGE) a new Custom Resource (CR) in the target cluster<ul>
<li>The resource is created in a specific namespace (for example the UUID of the Service Order)</li>
<li>A CR in a cluster will be mapped in TMF model as a Resource in the resource Inventory</li>
<li>Other related resources created by the CRD Controller within the namespace are automatically created in OSL Resource Inventory under the same Service Order</li>
</ul>
</li>
</ol>
<p><a class="glightbox" href="../images/cridge/img02.png" data-type="image" data-width="100%" data-height="auto" data-desc-position="bottom"><img alt="img02.png" src="../images/cridge/img02.png" /></a></p>
<p>The provided image illustrates the architecture and workflow of the CRIDGE service, showing how it interacts with other components within a Kubernetes (K8s) cluster. </p>
<p>Following, there is an explanation of the key components and flow in the diagram:</p>
<ul>
<li>Other OSL Services: This box represents various OSL services such as Service Spec Catalogue, Resource Spec Catalogue, Service Inventory, Resource Inventory, and OSOM (OpenSlice Service Orchestration and Management).</li>
<li>Service Bus: This is the communication layer that facilitates interaction between the CRIDGE service and other OSL services.</li>
<li>CRIDGE: CRIDGE acts as a bridge that converts CRDs (Custom Resource Definitions) to TMF (TM Forum) APIs and models. It enables the creation and management of Custom Resources (CRs) in the Kubernetes cluster.</li>
<li>
<p>K8s API: The Kubernetes API server, which is the central control point for managing the Kubernetes cluster. CRIDGE interacts with the K8s API to manage CRDs and CRs.</p>
<blockquote>
<p>CRD (Custom Resource Definition): A CRD is a way to define custom resources in Kubernetes cluster-wise. It allows the extension of Kubernetes API to create and manage user-defined resources. Example :
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">apiextensions.k8s.io/v1</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">CustomResourceDefinition</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="nt">metadata</span><span class="p">:</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">myresource.example.com</span>
</span></code></pre></div></p>
</blockquote>