ఓపెన్షిఫ్ట్ రూట్లలో TLS సర్టిఫికెట్లను డైనమిక్గా ఇంటిగ్రేట్ చేయడం ఎలా
అప్లికేషన్లను అమలు చేస్తున్నప్పుడు, TLS సర్టిఫికేట్లను సురక్షితంగా మరియు సమర్ధవంతంగా నిర్వహించడం చాలా ముఖ్యం. ఓపెన్షిఫ్ట్ వంటి సెటప్లలో, రహస్యాలు కోడ్ రిపోజిటరీ కాకుండా సురక్షితమైన ఖజానాలో ఉంటాయి, ఈ రహస్యాలను డైనమిక్గా డిప్లాయ్మెంట్ మానిఫెస్ట్లలోకి చేర్చడంలో సవాలు ఉంది.
మీరు హెల్మ్తో నేరుగా అమలు చేయడానికి బదులుగా `హెల్మ్ టెంప్లేట్`ని ఉపయోగించి మీ కుబెర్నెట్స్ మానిఫెస్ట్లను రూపొందిస్తున్నారని ఊహించుకోండి. ఈ విధానం, సమకాలీకరించడానికి ArgoCD వంటి సాధనాలతో కలిపి, అదనపు సంక్లిష్టతను పరిచయం చేస్తుంది: TLS ప్రమాణపత్ర రహస్యాలను డైనమిక్గా మానిఫెస్ట్లలోకి పొందడం.
ఉదాహరణకు, సాధారణ రూట్ కాన్ఫిగరేషన్లో (`route.yaml`), మీరు సర్టిఫికేట్ (`tls.crt`), కీ (`tls.key`) మరియు CA సర్టిఫికేట్ (`tls.key`) వంటి TLS ఫీల్డ్లను పూరించవచ్చు. `ca.crt`) ఫ్లైలో. ఇది హార్డ్కోడింగ్ సున్నితమైన డేటాను నివారిస్తుంది, మీ విస్తరణను సురక్షితంగా మరియు మాడ్యులర్గా చేస్తుంది. 🌟
కానీ మానిఫెస్ట్-ఆధారిత వ్యూహంలో హెల్మ్ టెంప్లేట్లు మరియు కుబెర్నెట్స్ రహస్యాలను ఉపయోగించి డైనమిక్గా దీన్ని సాధించవచ్చా? మీ విస్తరణ పైప్లైన్లో భద్రత మరియు సౌలభ్యాన్ని కొనసాగిస్తూనే హెల్మ్లోని `లుకప్` ఫంక్షన్ మరియు డైనమిక్ విలువలు ఈ సమస్యను ఎలా పరిష్కరించగలవో అన్వేషిద్దాం. 🚀
| ఆదేశం | ఉపయోగం యొక్క ఉదాహరణ |
|---|---|
| lookup | ఈ హెల్మ్ ఫంక్షన్ టెంప్లేట్ రెండరింగ్ సమయంలో డైనమిక్గా Kubernetes వనరులను ప్రశ్నిస్తుంది. ఉదాహరణకు, లుక్అప్("v1", "సీక్రెట్", "డిఫాల్ట్", "tls-secret-name") "డిఫాల్ట్" నేమ్స్పేస్లో పేర్కొన్న రహస్యాన్ని తిరిగి పొందుతుంది. |
| hasKey | మ్యాప్ లేదా ఆబ్జెక్ట్లో నిర్దిష్ట కీ ఉందో లేదో తనిఖీ చేయడానికి హెల్మ్ టెంప్లేట్లలో ఉపయోగించబడుతుంది. ఉదాహరణకు, hasKey $secretData.data "tls.crt" రహస్యం సర్టిఫికేట్ ఫీల్డ్ని కలిగి ఉందని నిర్ధారిస్తుంది. |
| b64dec | బేస్64-ఎన్కోడ్ చేసిన స్ట్రింగ్లను డీకోడ్ చేయడానికి హెల్మ్ టెంప్లేట్ ఫంక్షన్. ఉదాహరణకు, ఇండెక్స్ $secretData.data "tls.crt" | b64dec tls.crt ఫీల్డ్లో బేస్64 స్ట్రింగ్ను డీకోడ్ చేస్తుంది. |
| nindent | సరైన YAML ఇండెంటేషన్ కోసం నిర్దిష్ట సంఖ్యలో ఖాళీలను జోడించడానికి హెల్మ్ టెంప్లేట్లలో ఉపయోగించబడుతుంది. ఉదాహరణకు, YAML నిర్మాణంతో సమలేఖనం చేయడానికి నిండెంట్ 6 అవుట్పుట్ను 6 ఖాళీల ద్వారా ఇండెంట్ చేస్తుంది. |
| read_namespaced_secret | ఇచ్చిన నేమ్స్పేస్ నుండి నిర్దిష్ట రహస్యాన్ని పొందేందుకు పైథాన్ కుబెర్నెట్స్ క్లయింట్ పద్ధతి. ఉదాహరణ: v1.read_namespaced_secret("tls-secret-name", "default"). |
| base64.b64decode | బేస్64-ఎన్కోడ్ చేసిన డేటాను డీకోడ్ చేయడానికి పైథాన్ పద్ధతి. ఉదాహరణ: base64.b64decode(secret.data["tls.crt"]).decode("utf-8") ప్రమాణపత్రం స్ట్రింగ్ను డీకోడ్ చేస్తుంది. |
| clientcmd.BuildConfigFromFlags | kubeconfig ఫైల్ నుండి Kubernetes క్లయింట్ కాన్ఫిగరేషన్ని సృష్టించడానికి ఒక Go పద్ధతి. ఉదాహరణ: clientcmd.BuildConfigFromFlags("", os.Getenv("KUBECONFIG")). |
| clientset.CoreV1().Secrets().Get | కుబెర్నెటీస్ రహస్యాలను ప్రోగ్రామాటిక్గా తిరిగి పొందేందుకు ఒక గో పద్ధతి. ఉదాహరణ: clientset.CoreV1().Secrets("default").Get(context.TODO(), "tls-secret-name", metav1.GetOptions{}). |
| yaml.dump | డేటాను YAML ఫార్మాట్లో సీరియలైజ్ చేయడానికి పైథాన్ పద్ధతి. ఉదాహరణ: yaml.dump(route_yaml, f) TLS కాన్ఫిగరేషన్ను route.yaml ఫైల్కి వ్రాస్తుంది. |
| metav1.GetOptions | Kubernetes API అభ్యర్థనల కోసం ఎంపికలను పేర్కొనడానికి Goలో ఉపయోగించబడుతుంది. ఉదాహరణకు, ఇది క్లైంట్సెట్కి ఆర్గ్యుమెంట్గా పంపబడింది.కోర్వి1().సీక్రెట్స్().అభ్యర్థన పారామితులను నిర్వచించండి. |
కుబెర్నెటెస్ డిప్లాయ్మెంట్లలో TLS సీక్రెట్స్ యొక్క డైనమిక్ మేనేజ్మెంట్
a లో , సున్నితమైన డేటా హార్డ్కోడింగ్ లేకుండా TLS రహస్యాలను మీ కుబెర్నెట్స్ కాన్ఫిగరేషన్లలో సురక్షితంగా పొందడం మరియు సమగ్రపరచడం ప్రధాన సవాలు. హెల్మ్ టెంప్లేట్ల కోసం వ్రాయబడిన మొదటి స్క్రిప్ట్, వంటి విధులను ప్రభావితం చేస్తుంది మానిఫెస్ట్ జనరేషన్ సమయంలో రహస్యాలను డైనమిక్గా తిరిగి పొందడం. మీరు పరిసరాలలో మానిఫెస్ట్లను సమకాలీకరించడానికి ArgoCD వంటి సాధనాలతో పని చేస్తున్నప్పుడు ఈ విధానం ప్రత్యేకంగా ఉపయోగపడుతుంది. వంటి ఫంక్షన్ల కలయిక మరియు b64డిసెం చెల్లుబాటు అయ్యే మరియు సరిగ్గా ఎన్కోడ్ చేయబడిన రహస్యాలు మాత్రమే ప్రాసెస్ చేయబడతాయని నిర్ధారిస్తుంది, రన్టైమ్ లోపాలను నివారిస్తుంది.
ఉదాహరణకు, మీరు TLS ఫీల్డ్లను `route.yaml`లో డైనమిక్గా నింపాలని ఊహించుకోండి. మానిఫెస్ట్లో సున్నితమైన TLS ప్రమాణపత్రం, కీ మరియు CA ప్రమాణపత్రాన్ని పొందుపరచడానికి బదులుగా, Helm టెంప్లేట్ రన్టైమ్లో Kubernetes రహస్య దుకాణాన్ని ప్రశ్నిస్తుంది. `lookup("v1", "Secret", "namespace", "secret-name")` వంటి హెల్మ్ ఆదేశాన్ని ఉపయోగించడం ద్వారా, ఇది క్లస్టర్ నుండి డేటాను సురక్షితంగా పొందుతుంది. ఇది మీ కోడ్ రిపోజిటరీలో రహస్యాలను నిల్వ చేయవలసిన అవసరాన్ని తొలగిస్తుంది, మెరుగైన భద్రతను నిర్ధారిస్తుంది. 🚀
పైథాన్-ఆధారిత పరిష్కారం కుబెర్నెట్స్ రహస్యాలను పొందేందుకు మరియు ప్రాసెస్ చేయడానికి ప్రోగ్రామాటిక్ మార్గాన్ని అందిస్తుంది. ఇది రహస్యాలను తిరిగి పొందడానికి కుబెర్నెటెస్ పైథాన్ క్లయింట్ను ఉపయోగిస్తుంది మరియు వాటిని డైనమిక్గా YAML ఫైల్లో వ్రాస్తుంది. హెల్మ్ వెలుపల మానిఫెస్ట్లను రూపొందించేటప్పుడు లేదా ధృవీకరించేటప్పుడు ఇది ప్రత్యేకంగా ప్రభావవంతంగా ఉంటుంది, డిప్లాయ్మెంట్ వర్క్ఫ్లోలను ఆటోమేట్ చేయడంలో మరింత సౌలభ్యాన్ని అందిస్తుంది. ఉదాహరణకు, కస్టమ్ స్క్రిప్ట్లు మానిఫెస్ట్ సృష్టిని నిర్వహించే CI/CD పైప్లైన్లలో మీరు ఈ విధానాన్ని ఉపయోగించాల్సి రావచ్చు. బేస్64-ఎన్కోడ్ చేసిన రహస్య డేటాను డీకోడ్ చేసి, దాన్ని `route.yaml`కి ఇంజెక్ట్ చేయడం ద్వారా, పైప్లైన్ అంతటా సున్నితమైన డేటా సురక్షితంగా నిర్వహించబడుతుందని మీరు నిర్ధారిస్తారు. 🛡️
గో-ఆధారిత పరిష్కారం అనేది అధిక-పనితీరు గల వాతావరణాలకు అనుగుణంగా రూపొందించబడిన మరొక విధానం. Kubernetes Go క్లయింట్ని ఉపయోగించడం ద్వారా, మీరు నేరుగా రహస్యాలను పొందవచ్చు మరియు ప్రోగ్రామ్ల ప్రకారం కాన్ఫిగరేషన్లను రూపొందించవచ్చు. ఉదాహరణకు, అధిక నిర్గమాంశ అవసరాలు లేదా కఠినమైన జాప్యం పరిమితులు ఉన్న పరిసరాలలో, Go యొక్క సామర్థ్యం Kubernetes APIతో అతుకులు లేని పరస్పర చర్యను నిర్ధారిస్తుంది. స్క్రిప్ట్ TLS డేటాను పొందడం మరియు డీకోడ్ చేయడం మాత్రమే కాకుండా బలమైన ఎర్రర్ హ్యాండ్లింగ్ను కలిగి ఉంటుంది, ఇది ఉత్పత్తి వినియోగానికి అత్యంత నమ్మదగినదిగా చేస్తుంది. గోలో మాడ్యులర్ ఫంక్షన్లను ఉపయోగించడం వల్ల భవిష్యత్తులో ఇతర కుబెర్నెట్స్ రిసోర్స్ ఇంటిగ్రేషన్ల కోసం కోడ్ని మళ్లీ ఉపయోగించవచ్చని నిర్ధారిస్తుంది.
కుబెర్నెట్స్ రూట్ మానిఫెస్ట్లలో TLS సర్టిఫికెట్ల డైనమిక్ ఇంటిగ్రేషన్
మానిఫెస్ట్-ఆధారిత విస్తరణ వ్యూహం కోసం మాడ్యులర్ మరియు స్కేలబుల్ విధానాన్ని అందిస్తూ, TLS రహస్యాలను డైనమిక్గా పొందేందుకు ఈ పరిష్కారం Kubernetes స్థానిక `లుకప్` ఫంక్షనాలిటీతో కలిపి హెల్మ్ టెంప్లేట్లను ఉపయోగిస్తుంది.
{{- if .Values.ingress.tlsSecretName }}{{- $secretData := (lookup "v1" "Secret" .Release.Namespace .Values.ingress.tlsSecretName) }}{{- if $secretData }}{{- if hasKey $secretData.data "tls.crt" }}certificate: |{{- index $secretData.data "tls.crt" | b64dec | nindent 6 }}{{- end }}{{- if hasKey $secretData.data "tls.key" }}key: |{{- index $secretData.data "tls.key" | b64dec | nindent 6 }}{{- end }}{{- if hasKey $secretData.data "ca.crt" }}caCertificate: |{{- index $secretData.data "ca.crt" | b64dec | nindent 6 }}{{- end }}{{- end }}{{- end }}
పైథాన్లోని కుబెర్నెటెస్ API ద్వారా TLS రహస్యాలను పొందుతోంది
ఈ విధానం TLS రహస్యాలను ప్రోగ్రామాటిక్గా పొందేందుకు మరియు వాటిని డైనమిక్గా రూపొందించబడిన YAML ఫైల్లోకి ఇంజెక్ట్ చేయడానికి పైథాన్ కుబెర్నెట్స్ క్లయింట్ (`కుబెర్నెట్స్` ప్యాకేజీ)ని ఉపయోగిస్తుంది.
from kubernetes import client, configimport base64import yaml# Load Kubernetes configconfig.load_kube_config()# Define namespace and secret namenamespace = "default"secret_name = "tls-secret-name"# Fetch the secretv1 = client.CoreV1Api()secret = v1.read_namespaced_secret(secret_name, namespace)# Decode and process secret datatls_cert = base64.b64decode(secret.data["tls.crt"]).decode("utf-8")tls_key = base64.b64decode(secret.data["tls.key"]).decode("utf-8")ca_cert = base64.b64decode(secret.data["ca.crt"]).decode("utf-8")# Generate route.yamlroute_yaml = {"tls": {"certificate": tls_cert,"key": tls_key,"caCertificate": ca_cert}}# Save to YAML filewith open("route.yaml", "w") as f:yaml.dump(route_yaml, f)print("Route manifest generated successfully!")
కుబెర్నెట్స్ విస్తరణల కోసం గోతో రహస్యాలను సమగ్రపరచడం
ఈ పరిష్కారం TLS రహస్యాలను పొందేందుకు మరియు వాటిని YAML రూట్ కాన్ఫిగరేషన్లో డైనమిక్గా ఇంజెక్ట్ చేయడానికి Go Kubernetes క్లయింట్ని ఉపయోగిస్తుంది. ఇది లోపం నిర్వహణ మరియు రకం భద్రత ద్వారా పనితీరు మరియు భద్రతను నొక్కి చెబుతుంది.
package mainimport ("context""encoding/base64""fmt""os""k8s.io/client-go/kubernetes""k8s.io/client-go/tools/clientcmd")func main() {// Load kubeconfigconfig, err := clientcmd.BuildConfigFromFlags("", os.Getenv("KUBECONFIG"))if err != nil {panic(err.Error())}// Create clientsetclientset, err := kubernetes.NewForConfig(config)if err != nil {panic(err.Error())}// Get secretsecret, err := clientset.CoreV1().Secrets("default").Get(context.TODO(), "tls-secret-name", metav1.GetOptions{})if err != nil {panic(err.Error())}// Decode and print secret datatlsCrt, _ := base64.StdEncoding.DecodeString(string(secret.Data["tls.crt"]))tlsKey, _ := base64.StdEncoding.DecodeString(string(secret.Data["tls.key"]))caCrt, _ := base64.StdEncoding.DecodeString(string(secret.Data["ca.crt"]))fmt.Printf("Certificate: %s\n", tlsCrt)fmt.Printf("Key: %s\n", tlsKey)fmt.Printf("CA Certificate: %s\n", caCrt)}
కుబెర్నెటెస్లో TLS రహస్యాలను భద్రపరచడం: డైనమిక్ అప్రోచ్
a తో పని చేస్తున్నప్పుడు వ్యూహం, TLS సర్టిఫికెట్ల వంటి సున్నితమైన డేటాను నిర్వహించడంలో భద్రత మరియు సౌలభ్యం పరిగణించవలసిన ముఖ్యమైన అంశాలలో ఒకటి. మీ రిపోజిటరీలో ఈ రహస్యాలను హార్డ్కోడ్ చేయడం అసురక్షితమే కాకుండా మీ అప్లికేషన్ను పరిసరాలలో తక్కువ పోర్టబుల్గా చేస్తుంది. హెల్మ్ టెంప్లేట్లు లేదా కుబెర్నెటెస్ API కాల్లను ఉపయోగించి రన్టైమ్లో రహస్యాలను పొందడం వంటి డైనమిక్ విధానం, ఆటోమేటెడ్ వర్క్ఫ్లోలకు మద్దతు ఇస్తున్నప్పుడు మీ అప్లికేషన్ సురక్షితంగా ఉంటుందని నిర్ధారిస్తుంది.
ArgoCD వంటి సాధనాలతో అనుకూలతను నిర్ధారించడం మరొక క్లిష్టమైన అంశం. ArgoCD నేరుగా హెల్మ్ ద్వారా అమలు చేయకుండా ముందుగా రూపొందించిన మానిఫెస్ట్లను సమకాలీకరిస్తుంది కాబట్టి, ఈ మానిఫెస్ట్లలో రహస్యాలను డైనమిక్గా ఇంజెక్ట్ చేయడం సవాలుగా ఉంటుంది కానీ అవసరం అవుతుంది. హెల్మ్లను ఉపయోగించడం ద్వారా పైథాన్ లేదా గోలో ఫంక్షనాలిటీ లేదా ప్రోగ్రామాటిక్ సొల్యూషన్స్, మీరు కుబెర్నెట్స్ సీక్రెట్ స్టోర్ నుండి రహస్యాలు సురక్షితంగా పొందబడుతున్నాయని నిర్ధారించుకోవచ్చు. ఈ విధంగా, మానిఫెస్ట్లు ముందుగా రూపొందించబడినప్పటికీ, పర్యావరణ రహస్య కాన్ఫిగరేషన్ ఆధారంగా అవి డైనమిక్గా స్వీకరించబడతాయి. 🚀
అదనంగా, స్కేలింగ్ విస్తరణలకు ఆటోమేషన్ కీలకం. TLS రహస్యాలను పొందడం, డీకోడ్ చేయడం మరియు ఇంజెక్ట్ చేసే పైప్లైన్లను అమలు చేయడం ద్వారా, మీరు మాన్యువల్ జోక్యాన్ని తగ్గించి, లోపాలను తొలగిస్తారు. ఉదాహరణకు, TLS సర్టిఫికేట్లను ధృవీకరించడానికి పైథాన్ స్క్రిప్ట్లను ఏకీకృతం చేయడం లేదా అధిక-పనితీరు అవసరాలను నిర్వహించడానికి గో క్లయింట్లు విశ్వసనీయత మరియు సామర్థ్యం రెండింటినీ జోడిస్తాయి. ఈ పద్ధతుల్లో ప్రతి ఒక్కటి మీ పైప్లైన్లు లేదా మానిఫెస్ట్లలో సాదాపాఠం సున్నితమైన డేటాను నివారించడం వంటి భద్రతా ఉత్తమ అభ్యాసాలకు అనుగుణంగా ఉండేలా చూస్తుంది. 🌟
- ఎలా చేస్తుంది హెల్మ్లో ఫంక్షన్ వర్క్?
- ది ఫంక్షన్ టెంప్లేట్ రెండరింగ్ సమయంలో Kubernetes వనరులను ప్రశ్నిస్తుంది. దీనికి API సంస్కరణ, వనరు రకం, నేమ్స్పేస్ మరియు వనరు పేరు వంటి పారామీటర్లు అవసరం.
- ArgoCD డైనమిక్ రహస్య పొందడాన్ని నిర్వహించగలదా?
- నేరుగా కాదు, కానీ మీరు వంటి సాధనాలను ఉపయోగించవచ్చు ArgoCDతో సమకాలీకరించడానికి ముందు డైనమిక్గా ఇంజెక్ట్ చేయబడిన రహస్యాలతో మానిఫెస్ట్లను ముందుగా రూపొందించడానికి.
- ఎందుకు వాడాలి హెల్మ్ టెంప్లేట్లలో?
- ది ఫంక్షన్ బేస్64-ఎన్కోడ్ చేసిన స్ట్రింగ్లను డీకోడ్ చేస్తుంది, ఇది కుబెర్నెట్స్లో బేస్ 64గా నిల్వ చేయబడిన రహస్యాలకు అవసరం.
- ఈ పని కోసం పైథాన్ని ఉపయోగించడం వల్ల ప్రయోజనం ఏమిటి?
- ద్వారా కుబెర్నెట్స్తో పరస్పర చర్య చేయడానికి పైథాన్ అనువైన మార్గాన్ని అందిస్తుంది లైబ్రరీ, కనిష్ట కోడ్తో YAML మానిఫెస్ట్ల డైనమిక్ జనరేషన్ను అనుమతిస్తుంది.
- Go Kubernetes రహస్య నిర్వహణను ఎలా మెరుగుపరుస్తుంది?
- గో యొక్క అధిక పనితీరు మరియు టైప్-సురక్షిత సామర్థ్యాలు వంటి లైబ్రరీలను ఉపయోగించి పెద్ద-స్థాయి కుబెర్నెట్స్ విస్తరణలకు అనువైనవి API పరస్పర చర్య కోసం.
కుబెర్నెటీస్లో, TLS రహస్యాలను డైనమిక్గా నిర్వహించడం సురక్షితమైన మరియు స్కేలబుల్ విస్తరణ పైప్లైన్ను నిర్ధారిస్తుంది. హెల్మ్ను ప్రభావితం చేయడం వంటి సాంకేతికతలు ఫంక్షన్ లేదా ప్రోగ్రామింగ్ స్క్రిప్ట్లను ఉపయోగించి కుబెర్నెటెస్ రహస్యాలు అతుకులు లేని ఏకీకరణకు అనుమతిస్తాయి, హార్డ్కోడెడ్ సెన్సిటివ్ డేటాతో సంబంధం ఉన్న నష్టాలను తగ్గిస్తుంది.
హెల్మ్, పైథాన్ లేదా గోని ఉపయోగించినా, సౌలభ్యాన్ని కొనసాగిస్తూ భద్రతా ప్రమాణాలకు అనుగుణంగా ఉండేలా పైప్లైన్ను నిర్మించడమే కీలకం. TLS రహస్యాలను డైనమిక్గా ఇంజెక్ట్ చేయడం ద్వారా, టీమ్లు మారుతున్న వాతావరణాలకు సమర్ధవంతంగా అనుగుణంగా మారతాయి మరియు సంభావ్య దుర్బలత్వాల నుండి తమ విస్తరణలను సురక్షితంగా ఉంచుతాయి. 🌟
- ఉపయోగించడం గురించి వివరణాత్మక సమాచారం హెల్మ్ టెంప్లేట్లలోని ఫంక్షన్ని ఇక్కడ చూడవచ్చు హెల్మ్ డాక్యుమెంటేషన్ .
- Python Kubernetes క్లయింట్ వినియోగం కోసం, అధికారిక డాక్యుమెంటేషన్ని సందర్శించండి కుబెర్నెటెస్ పైథాన్ క్లయింట్ .
- గో క్లయింట్-గో ఉదాహరణలు మరియు కుబెర్నెట్స్ రహస్యాలతో పరస్పర చర్య చేయడానికి ఉత్తమ అభ్యాసాలు అందించబడ్డాయి కుబెర్నెటెస్ గో క్లయింట్ రిపోజిటరీ .
- కుబెర్నెట్స్లో TLS సర్టిఫికెట్లను డైనమిక్గా నిర్వహించడానికి భద్రతా మార్గదర్శకాలు ఇక్కడ వివరించబడ్డాయి కుబెర్నెటెస్ TLS మేనేజ్మెంట్ .
- మానిఫెస్ట్-ఆధారిత విస్తరణలతో ArgoCDని నిర్వహించడంలో అంతర్దృష్టులు ఇక్కడ అందుబాటులో ఉన్నాయి ArgoCD అధికారిక డాక్యుమెంటేషన్ .