diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..d78c7eb --- /dev/null +++ b/404.html @@ -0,0 +1,20 @@ + + + + + + Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

404

There's nothing here.
+ Take me home. +
+ + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c5df15 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# Kubernetes + Knative + GitLab + Harbor + +[![Build Status](https://github.com/ruzickap/k8s-knative-gitlab-harbor/workflows/vuepress-build/badge.svg)](https://github.com/ruzickap/k8s-knative-gitlab-harbor) + +* Demo GitHub repository: [https://github.com/ruzickap/k8s-knative-gitlab-harbor](https://github.com/ruzickap/k8s-knative-gitlab-harbor) +* Demo Web Pages: [https://ruzickap.github.io/k8s-knative-gitlab-harbor](https://ruzickap.github.io/k8s-knative-gitlab-harbor) +* Asciinema: [https://asciinema.org/a/290547](https://asciinema.org/a/290547) + +## Requirements + +* [awscli](https://aws.amazon.com/cli/) +* [AWS IAM Authenticator for Kubernetes](https://github.com/kubernetes-sigs/aws-iam-authenticator) +* [AWS account](https://aws.amazon.com/account/) +* [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) +* [kops](https://github.com/kubernetes/kops) +* Kubernetes, Docker, Linux, AWS knowledge required + +## Content + +* [Part 01 - Create "kops" cluster](https://github.com/ruzickap/k8s-knative-gitlab-harbor/tree/main/docs/part-01/README.md) +* [Part 02 - Install Helm](https://github.com/ruzickap/k8s-knative-gitlab-harbor/tree/main/docs/part-02/README.md) +* [Part 03 - Istio + cert-manager + kubed installation](https://github.com/ruzickap/k8s-knative-gitlab-harbor/tree/main/docs/part-03/README.md) +* [Part 04 - Harbor installation](https://github.com/ruzickap/k8s-knative-gitlab-harbor/tree/main/docs/part-04/README.md) +* [Part 05 - GitLab installation](https://github.com/ruzickap/k8s-knative-gitlab-harbor/tree/main/docs/part-05/README.md) +* [Part 06 - Knative installation](https://github.com/ruzickap/k8s-knative-gitlab-harbor/tree/main/docs/part-06/README.md) +* [Part 07 - Build and run container image using Knative + Tekton](https://github.com/ruzickap/k8s-knative-gitlab-harbor/tree/main/docs/part-07/README.md) +* [Part 08 - Automated deployment with Tekton](https://github.com/ruzickap/k8s-knative-gitlab-harbor/tree/main/docs/part-08/README.md) +* [Part 09 - Knative operations](https://github.com/ruzickap/k8s-knative-gitlab-harbor/tree/main/docs/part-09/README.md) +* [Part 10 - Clean-up](https://github.com/ruzickap/k8s-knative-gitlab-harbor/tree/main/docs/part-10/README.md) + +## Asciinema + +[![asciicast](https://asciinema.org/a/290547.svg)](https://asciinema.org/a/290547) diff --git a/assets/css/0.styles.985b6b59.css b/assets/css/0.styles.985b6b59.css new file mode 100644 index 0000000..e72093d --- /dev/null +++ b/assets/css/0.styles.985b6b59.css @@ -0,0 +1 @@ +.medium-zoom-overlay{z-index:100}.medium-zoom-overlay~img{z-index:101}html{scroll-behavior:smooth}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;-webkit-user-select:none;user-select:none;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.go-to-top[data-v-5fd4ef0c]{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;color:#3eaf7c;z-index:1}.go-to-top[data-v-5fd4ef0c]:hover{color:#72cda4}@media (max-width:959px){.go-to-top[data-v-5fd4ef0c]{display:none}}.fade-enter-active[data-v-5fd4ef0c],.fade-leave-active[data-v-5fd4ef0c]{transition:opacity .3s}.fade-enter[data-v-5fd4ef0c],.fade-leave-to[data-v-5fd4ef0c]{opacity:0}.reading-progress[data-v-3640397f]{position:fixed;z-index:1000;background:transparent;overflow:hidden}.reading-progress .progress[data-v-3640397f]{width:100%;height:100%;background:#3eaf7c;background-image:none;transform-origin:0 0;transition:transform .2s ease-out}.top[data-v-3640397f]{top:0;left:0;right:0;width:100%;height:3px}.bottom[data-v-3640397f]{bottom:0;left:0;right:0;width:100%;height:3px}.left[data-v-3640397f]{left:0;top:0;bottom:0;width:3px;height:100%}.right[data-v-3640397f]{right:0;top:0;bottom:0;width:3px;height:100%}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #eaecef}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#eaecef;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#3eaf7c;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#2c3e50}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#eaecef;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#eaecef}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#2c3e50}@media (min-width:719px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:719px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #389d70}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/k8s-knative-gitlab-harbor/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px}.theme-code-block[data-v-759a7d02]{display:none}.theme-code-block__active[data-v-759a7d02]{display:block}.theme-code-block>pre[data-v-759a7d02]{background-color:orange}.theme-code-group__nav[data-v-deefee04]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-deefee04]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-deefee04]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-deefee04]{border-bottom:1px solid #42b983}.pre-blank[data-v-deefee04]{color:#42b983}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;animation-name:sbx-reset-in;animation-duration:.15s}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #46bd87}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-heading.clickable:hover{color:#3eaf7c}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}} \ No newline at end of file diff --git a/assets/img/GitHub_Webhooks-Details.da577fc5.png b/assets/img/GitHub_Webhooks-Details.da577fc5.png new file mode 100644 index 0000000..4ccf662 Binary files /dev/null and b/assets/img/GitHub_Webhooks-Details.da577fc5.png differ diff --git a/assets/img/GitHub_Webhooks.3cdaed97.png b/assets/img/GitHub_Webhooks.3cdaed97.png new file mode 100644 index 0000000..21d3b31 Binary files /dev/null and b/assets/img/GitHub_Webhooks.3cdaed97.png differ diff --git a/assets/img/GitLab.dd7e0dbb.png b/assets/img/GitLab.dd7e0dbb.png new file mode 100644 index 0000000..32b288f Binary files /dev/null and b/assets/img/GitLab.dd7e0dbb.png differ diff --git a/assets/img/Tekton_Dashboard.258cb264.png b/assets/img/Tekton_Dashboard.258cb264.png new file mode 100644 index 0000000..0071196 Binary files /dev/null and b/assets/img/Tekton_Dashboard.258cb264.png differ diff --git a/assets/img/harbor_login_page.703b5e90.png b/assets/img/harbor_login_page.703b5e90.png new file mode 100644 index 0000000..eb22d5d Binary files /dev/null and b/assets/img/harbor_login_page.703b5e90.png differ diff --git a/assets/img/harbor_projects.338db00b.png b/assets/img/harbor_projects.338db00b.png new file mode 100644 index 0000000..c4265b3 Binary files /dev/null and b/assets/img/harbor_projects.338db00b.png differ diff --git a/assets/img/kubed.e88b1fb6.svg b/assets/img/kubed.e88b1fb6.svg new file mode 100644 index 0000000..14c7ef7 --- /dev/null +++ b/assets/img/kubed.e88b1fb6.svg @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + namespace: cert-manager + + + namespace: cert-manager + + + + + + + + cert- manager + + + cert- manager + + + + + + + + ingress-cert secretlabel: app=kubed + + + ingress-cert secretlabel: app=kubed + + + + + + + + + + + + + + + namespace: harborlabel: app=kubed + + + namespace: harborlabel: app=kubed + + + + + + + + ingress-cert secret + + + ingress-cert secret + + + + + + + + kubed + + + kubed + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/podinfo.d8c508a4.png b/assets/img/podinfo.d8c508a4.png new file mode 100644 index 0000000..64394f6 Binary files /dev/null and b/assets/img/podinfo.d8c508a4.png differ diff --git a/assets/img/podinfo_http_https.799760ac.png b/assets/img/podinfo_http_https.799760ac.png new file mode 100644 index 0000000..b902a09 Binary files /dev/null and b/assets/img/podinfo_http_https.799760ac.png differ diff --git a/assets/img/search.83621669.svg b/assets/img/search.83621669.svg new file mode 100644 index 0000000..03d8391 --- /dev/null +++ b/assets/img/search.83621669.svg @@ -0,0 +1 @@ + diff --git a/assets/js/1.416be298.js b/assets/js/1.416be298.js new file mode 100644 index 0000000..ae76333 --- /dev/null +++ b/assets/js/1.416be298.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1,12,14,19,20,23],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return s})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return p})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return k}));n(92);const s=/#.*$/,i=/\.(md|html)$/,r=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(s,"").replace(i,"")}function l(t){return o.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(l(t))return t;const e=t.match(s),n=e?e[0]:"",i=a(t);return r.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(s);if(e)return e[0]}(e);if(i&&n!==i)return!1;return a(t.path)===a(e)}function p(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const s=t.charAt(0);if("/"===s)return t;if("?"===s||"#"===s)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,s,i=1){if("string"==typeof e)return p(n,e,s);if(Array.isArray(e))return Object.assign(p(n,e[0],s),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(p(n,e.path,s),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:r.map(e=>t(e,n,s,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function k(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},247:function(t,e,n){},248:function(t,e,n){"use strict";n.r(e);var s=n(246),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(s.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(s.g)(this.link)||Object(s.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(s.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(s.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(8),o=Object(r.a)(i,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},249:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(250),n(8)),r=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},250:function(t,e,n){"use strict";n(247)},251:function(t,e,n){},254:function(t,e,n){},258:function(t,e,n){"use strict";n(251)},261:function(t,e,n){"use strict";n.r(e);var s=n(248),i=n(249),r=n(93),o=n.n(r),a={name:"DropdownLink",components:{NavLink:s.default,DropdownTransition:i.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(258),n(8)),u=Object(l.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,s){return e("li",{key:n.link||s,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(s){return e("li",{key:s.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:s},on:{focusout:function(e){t.isLastItemOfArray(s,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},264:function(t,e,n){"use strict";n(254)},265:function(t,e,n){},272:function(t,e,n){"use strict";n.r(e);var s=n(261),i=n(246),r={name:"NavLinks",components:{NavLink:n(248).default,DropdownLink:s.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,s=this.$site.themeConfig.locales||{},i={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(i=>{const r=t[i],o=s[i]&&s[i].label||r.lang;let a;return r.lang===this.$lang?a=e:(a=e.replace(this.$localeConfig.path,i),n.some(t=>t.path===a)||(a=i)),{text:o,link:a}})};return[...this.userNav,i]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(i.j)(t),{items:(t.items||[]).map(i.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n{let s=i()(e,"title","");return i()(e,"frontmatter.tags")&&(s+=" "+e.frontmatter.tags.join(" ")),n&&(s+=" "+n),o(t,s)};const o=(t,e)=>{const n=t=>t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),s=new RegExp("[^\0-]"),i=t.split(/\s+/g).map(t=>t.trim()).filter(t=>!!t);if(s.test(t))return i.some(t=>e.toLowerCase().indexOf(t)>-1);{const s=t.endsWith(" ");return new RegExp(i.map((t,e)=>i.length!==e+1||s?`(?=.*\\b${n(t)}\\b)`:`(?=.*\\b${n(t)})`).join("")+".+","gi").test(e)}};var a={name:"SearchBox",data:()=>({query:"",focused:!1,focusIndex:0,placeholder:void 0}),computed:{showSuggestions(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions(){const t=this.query.trim().toLowerCase();if(!t)return;const{pages:e}=this.$site,n=this.$site.themeConfig.searchMaxSuggestions||5,s=this.$localePath,i=[];for(let o=0;o=n);o++){const a=e[o];if(this.getPageLocalePath(a)===s&&this.isSearchable(a))if(r(t,a))i.push(a);else if(a.headers)for(let e=0;e=n);e++){const n=a.headers[e];n.title&&r(t,a,n.title)&&i.push(Object.assign({},a,{path:a.path+"#"+n.slug,header:n}))}}return i},alignRight(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},mounted(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",document.addEventListener("keydown",this.onHotkey)},beforeDestroy(){document.removeEventListener("keydown",this.onHotkey)},methods:{getPageLocalePath(t){for(const e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},isSearchable(t){let e=null;return null===e||(e=Array.isArray(e)?e:new Array(e),e.filter(e=>t.path.match(e)).length>0)},onHotkey(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(this.$refs.input.focus(),t.preventDefault())},onUp(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown(){this.showSuggestions&&(this.focusIndex "+t._s(n.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports,c=n(290),h=n(272);function f(t,e){return t.ownerDocument.defaultView.getComputedStyle(t,null)[e]}var p={name:"Navbar",components:{SidebarButton:c.default,NavLinks:h.default,SearchBox:u,AlgoliaSearchBox:{}},data:()=>({linksWrapMaxWidth:null}),computed:{algolia(){return this.$themeLocaleConfig.algolia||this.$site.themeConfig.algolia||{}},isAlgoliaSearch(){return this.algolia&&this.algolia.apiKey&&this.algolia.indexName}},mounted(){const t=parseInt(f(this.$el,"paddingLeft"))+parseInt(f(this.$el,"paddingRight")),e=()=>{document.documentElement.clientWidth<719?this.linksWrapMaxWidth=null:this.linksWrapMaxWidth=this.$el.offsetWidth-t-(this.$refs.siteName&&this.$refs.siteName.offsetWidth||0)};e(),window.addEventListener("resize",e,!1)}},d=(n(297),Object(l.a)(p,(function(){var t=this,e=t._self._c;return e("header",{staticClass:"navbar"},[e("SidebarButton",{on:{"toggle-sidebar":function(e){return t.$emit("toggle-sidebar")}}}),t._v(" "),e("RouterLink",{staticClass:"home-link",attrs:{to:t.$localePath}},[t.$site.themeConfig.logo?e("img",{staticClass:"logo",attrs:{src:t.$withBase(t.$site.themeConfig.logo),alt:t.$siteTitle}}):t._e(),t._v(" "),t.$siteTitle?e("span",{ref:"siteName",staticClass:"site-name",class:{"can-hide":t.$site.themeConfig.logo}},[t._v(t._s(t.$siteTitle))]):t._e()]),t._v(" "),e("div",{staticClass:"links",style:t.linksWrapMaxWidth?{"max-width":t.linksWrapMaxWidth+"px"}:{}},[t.isAlgoliaSearch?e("AlgoliaSearchBox",{attrs:{options:t.algolia}}):!1!==t.$site.themeConfig.search&&!1!==t.$page.frontmatter.search?e("SearchBox"):t._e(),t._v(" "),e("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null));e.default=d.exports}}]); \ No newline at end of file diff --git a/assets/js/10.f496eaac.js b/assets/js/10.f496eaac.js new file mode 100644 index 0000000..2fd6172 --- /dev/null +++ b/assets/js/10.f496eaac.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10,3,12,14,18,19,23],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return r})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return h})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return f})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return g}));n(92);const i=/#.*$/,s=/\.(md|html)$/,r=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(s,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",s=o(t);return r.test(s)?t:s+".html"+n}function h(t,e){const n=decodeURIComponent(t.hash),s=function(t){const e=t.match(i);if(e)return e[0]}(e);if(s&&n!==s)return!1;return o(t.path)===o(e)}function d(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const s=e.split("/");n&&s[s.length-1]||s.pop();const r=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,s=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const r=e.children||[];return 0===r.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:r.map(e=>t(e,n,i,s+1)),collapsable:!1!==e.collapsable}}}(t,s,n)):[]}return[]}function b(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},247:function(t,e,n){},248:function(t,e,n){"use strict";n.r(e);var i=n(246),s={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},r=n(8),a=Object(r.a)(s,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},249:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},s=(n(250),n(8)),r=Object(s.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=r.exports},250:function(t,e,n){"use strict";n(247)},251:function(t,e,n){},252:function(t,e,n){},254:function(t,e,n){},257:function(t,e,n){},258:function(t,e,n){"use strict";n(251)},259:function(t,e,n){"use strict";n(252)},260:function(t,e,n){"use strict";n.r(e);var i=n(273),s=n(262),r=n(246);function a(t,e){if("group"===e.type){const n=e.path&&Object(r.e)(t,e.path),i=e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(r.e)(t,e.path));return n||i}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:i.default,SidebarLink:s.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(r.e)(this.$route,t.regularPath)}}},l=n(8),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,i){return e("li",{key:i},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:i===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(i)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},261:function(t,e,n){"use strict";n.r(e);var i=n(248),s=n(249),r=n(93),a=n.n(r),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:s.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(258),n(8)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},262:function(t,e,n){"use strict";n.r(e);var i=n(246);function s(t,e,n,i,s){const r={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:i,"sidebar-link":!0}};return s>2&&(r.style={"padding-left":s+"rem"}),t("RouterLink",r,n)}function r(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(i.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,n+"#"+e.slug,e.title,u,e.level-1),r(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(i.e)(a,u.path),h="auto"===u.type?p||u.children.some(t=>Object(i.e)(a,u.basePath+"#"+t.slug)):p,d="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,h),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[d,r(t,u.children,u.basePath,a,f)];if((h||b)&&u.headers&&!i.d.test(u.path)){return[d,r(t,Object(i.c)(u.headers),u.path,a,f)]}return d}},o=(n(259),n(8)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},264:function(t,e,n){"use strict";n(254)},270:function(t,e,n){"use strict";n(257)},271:function(t,e,n){},272:function(t,e,n){"use strict";n.r(e);var i=n(261),s=n(246),r={name:"NavLinks",components:{NavLink:n(248).default,DropdownLink:i.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,i=this.$site.themeConfig.locales||{},s={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(s=>{const r=t[s],a=i[s]&&i[s].label||r.lang;let o;return r.lang===this.$lang?o=e:(o=e.replace(this.$localeConfig.path,s),n.some(t=>t.path===o)||(o=s)),{text:a,link:o}})};return[...this.userNav,s]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(s.j)(t),{items:(t.items||[]).map(s.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;nfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function g(t){const e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function v(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},253:function(t,e){t.exports=function(t){return null==t}},255:function(t,e,n){},256:function(t,e,n){},266:function(t,e,n){"use strict";n(255)},267:function(t,e,n){var r=n(12),i=n(4),a=n(11);t.exports=function(t){return"string"==typeof t||!i(t)&&a(t)&&"[object String]"==r(t)}},268:function(t,e,n){"use strict";n(256)},269:function(t,e,n){},274:function(t,e,n){"use strict";n.r(e);var r=n(253),i=n.n(r),a=n(246),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=i()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:r="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,r,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,r,i){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i+`?mode=edit&spa=0&at=${r}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${r}/`+(n?n.replace(a.a,"")+"/":"")+i}}},o=(n(266),n(8)),u=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=u.exports},275:function(t,e,n){"use strict";n.r(e);n(92);var r=n(246),i=n(267),a=n.n(i),s=n(253),o=n.n(s),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return l(c.PREV,this)},next(){return l(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function l(t,{$themeConfig:e,$page:n,$route:i,$site:s,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:l,getPageLinkConfig:p}=t,f=l(e),d=p(n),h=o()(d)?f:d;return!1===h?void 0:a()(h)?Object(r.k)(s.pages,h,i.path):c(n,u)}function p(t,e,n){const r=[];!function t(e,n){for(let r=0,i=e.length;rfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},247:function(t,e,n){},248:function(t,e,n){"use strict";n.r(e);var i=n(246),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(8),a=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=a.exports},249:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(250),n(8)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},250:function(t,e,n){"use strict";n(247)},251:function(t,e,n){},254:function(t,e,n){},258:function(t,e,n){"use strict";n(251)},261:function(t,e,n){"use strict";n.r(e);var i=n(248),r=n(249),s=n(93),a=n.n(s),o={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>a()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(258),n(8)),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports},264:function(t,e,n){"use strict";n(254)},272:function(t,e,n){"use strict";n.r(e);var i=n(261),r=n(246),s={name:"NavLinks",components:{NavLink:n(248).default,DropdownLink:i.default},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:t}=this.$site;if(t&&Object.keys(t).length>1){const e=this.$page.path,n=this.$router.options.routes,i=this.$site.themeConfig.locales||{},r={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(t).map(r=>{const s=t[r],a=i[r]&&i[r].label||s.lang;let o;return s.lang===this.$lang?o=e:(o=e.replace(this.$localeConfig.path,r),n.some(t=>t.path===o)||(o=r)),{text:a,link:o}})};return[...this.userNav,r]}return this.userNav},userLinks(){return(this.nav||[]).map(t=>Object.assign(Object(r.j)(t),{items:(t.items||[]).map(r.j)}))},repoLink(){const{repo:t}=this.$site.themeConfig;return t?/^https?:/.test(t)?t:"https://github.com/"+t:null},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"];for(let n=0;n({placeholder:void 0}),watch:{$lang(e){this.update(this.options,e)},options(e){this.update(e,this.$lang)}},mounted(){this.initialize(this.options,this.$lang),this.placeholder=this.$site.themeConfig.searchPlaceholder||""},methods:{initialize(e,t){Promise.all([Promise.all([a.e(0),a.e(9)]).then(a.t.bind(null,311,7)),Promise.all([a.e(0),a.e(9)]).then(a.t.bind(null,312,7))]).then(([a])=>{a=a.default;const{algoliaOptions:i={}}=e;a(Object.assign({},e,{inputSelector:"#algolia-search-input",algoliaOptions:{...i,facetFilters:["lang:"+t].concat(i.facetFilters||[])},handleSelected:(e,t,a)=>{const{pathname:i,hash:n}=new URL(a.url),r=i.replace(this.$site.base,"/"),s=decodeURIComponent(n);this.$router.push(`${r}${s}`)}}))})},update(e,t){this.$el.innerHTML='',this.initialize(e,t)}}},n=(a(295),a(8)),r=Object(n.a)(i,(function(){var e=this._self._c;return e("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[e("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/14.30343ebc.js b/assets/js/14.30343ebc.js new file mode 100644 index 0000000..4724136 --- /dev/null +++ b/assets/js/14.30343ebc.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14,19,23],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return o})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return h})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return b})),n.d(e,"j",(function(){return g}));n(92);const i=/#.*$/,r=/\.(md|html)$/,s=/\/$/,o=/^[a-z]+:/i;function a(t){return decodeURI(t).replace(i,"").replace(r,"")}function l(t){return o.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(i),n=e?e[0]:"",r=a(t);return s.test(r)?t:r+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return a(t.path)===a(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return h(n,e,i);if(Array.isArray(e))return Object.assign(h(n,e[0],i),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function b(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},247:function(t,e,n){},248:function(t,e,n){"use strict";n.r(e);var i=n(246),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=n(8),o=Object(s.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=o.exports},249:function(t,e,n){"use strict";n.r(e);var i={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},r=(n(250),n(8)),s=Object(r.a)(i,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},250:function(t,e,n){"use strict";n(247)},251:function(t,e,n){},258:function(t,e,n){"use strict";n(251)},261:function(t,e,n){"use strict";n.r(e);var i=n(248),r=n(249),s=n(93),o=n.n(s),a={name:"DropdownLink",components:{NavLink:i.default,DropdownTransition:r.default},props:{item:{required:!0}},data:()=>({open:!1}),computed:{dropdownAriaLabel(){return this.item.ariaLabel||this.item.text}},watch:{$route(){this.open=!1}},methods:{setOpen(t){this.open=t},isLastItemOfArray:(t,e)=>o()(e)===t,handleDropdown(){0===event.detail&&this.setOpen(!this.open)}}},l=(n(258),n(8)),u=Object(l.a)(a,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[e("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow down"})]),t._v(" "),e("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[e("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),e("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),e("DropdownTransition",[e("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(n,i){return e("li",{key:n.link||i,staticClass:"dropdown-item"},["links"===n.type?e("h4",[t._v("\n "+t._s(n.text)+"\n ")]):t._e(),t._v(" "),"links"===n.type?e("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(n.items,(function(i){return e("li",{key:i.link,staticClass:"dropdown-subitem"},[e("NavLink",{attrs:{item:i},on:{focusout:function(e){t.isLastItemOfArray(i,n.items)&&t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0):e("NavLink",{attrs:{item:n},on:{focusout:function(e){t.isLastItemOfArray(n,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null);e.default=u.exports}}]); \ No newline at end of file diff --git a/assets/js/15.d3972987.js b/assets/js/15.d3972987.js new file mode 100644 index 0000000..9b90360 --- /dev/null +++ b/assets/js/15.d3972987.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{246:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return o})),e.d(n,"i",(function(){return a})),e.d(n,"f",(function(){return u})),e.d(n,"g",(function(){return c})),e.d(n,"h",(function(){return p})),e.d(n,"b",(function(){return l})),e.d(n,"e",(function(){return f})),e.d(n,"k",(function(){return h})),e.d(n,"l",(function(){return d})),e.d(n,"c",(function(){return v})),e.d(n,"j",(function(){return b}));e(92);const r=/#.*$/,i=/\.(md|html)$/,o=/\/$/,a=/^[a-z]+:/i;function s(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return a.test(t)}function c(t){return/^mailto:/.test(t)}function p(t){return/^tel:/.test(t)}function l(t){if(u(t))return t;const n=t.match(r),e=n?n[0]:"",i=s(t);return o.test(i)?t:i+".html"+e}function f(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return s(t.path)===s(n)}function h(t,n,e){if(u(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const o=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return h(e,n,r);if(Array.isArray(n))return Object.assign(h(e,n[0],r),{title:n[1]});{const o=n.children||[];return 0===o.length&&n.path?Object.assign(h(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,initialOpenGroupIndex:n.initialOpenGroupIndex,children:o.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function g(t){const n=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function v(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},253:function(t,n){t.exports=function(t){return null==t}},256:function(t,n,e){},267:function(t,n,e){var r=e(12),i=e(4),o=e(11);t.exports=function(t){return"string"==typeof t||!i(t)&&o(t)&&"[object String]"==r(t)}},268:function(t,n,e){"use strict";e(256)},275:function(t,n,e){"use strict";e.r(n);e(92);var r=e(246),i=e(267),o=e.n(i),a=e(253),s=e.n(a),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return p(c.PREV,this)},next(){return p(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,n){return l(t,n,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,n){return l(t,n,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function p(t,{$themeConfig:n,$page:e,$route:i,$site:a,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:p,getPageLinkConfig:l}=t,f=p(n),h=l(e),d=s()(h)?f:h;return!1===d?void 0:o()(d)?Object(r.k)(a.pages,d,i.path):c(e,u)}function l(t,n,e){const r=[];!function t(n,e){for(let r=0,i=n.length;rfunction t(e,n,i,r=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function m(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},248:function(t,e,n){"use strict";n.r(e);var i=n(246),r={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(i.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(i.g)(this.link)||Object(i.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(i.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(i.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},a=n(8),s=Object(a.a)(r,(function(){var t=this,e=t._self._c;return t.isInternal?e("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?e("OutboundLink"):t._e()],1)}),[],!1,null,null,null);e.default=s.exports},263:function(t,e,n){},276:function(t,e,n){"use strict";n(263)},287:function(t,e,n){"use strict";n.r(e);var i={name:"Home",components:{NavLink:n(248).default},computed:{data(){return this.$page.frontmatter},actionLink(){return{link:this.data.actionLink,text:this.data.actionText}}}},r=(n(276),n(8)),a=Object(r.a)(i,(function(){var t=this,e=t._self._c;return e("main",{staticClass:"home",attrs:{"aria-labelledby":null!==t.data.heroText?"main-title":null}},[e("header",{staticClass:"hero"},[t.data.heroImage?e("img",{attrs:{src:t.$withBase(t.data.heroImage),alt:t.data.heroAlt||"hero"}}):t._e(),t._v(" "),null!==t.data.heroText?e("h1",{attrs:{id:"main-title"}},[t._v("\n "+t._s(t.data.heroText||t.$title||"Hello")+"\n ")]):t._e(),t._v(" "),null!==t.data.tagline?e("p",{staticClass:"description"},[t._v("\n "+t._s(t.data.tagline||t.$description||"Welcome to your VuePress site")+"\n ")]):t._e(),t._v(" "),t.data.actionText&&t.data.actionLink?e("p",{staticClass:"action"},[e("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()]),t._v(" "),t.data.features&&t.data.features.length?e("div",{staticClass:"features"},t._l(t.data.features,(function(n,i){return e("div",{key:i,staticClass:"feature"},[e("h2",[t._v(t._s(n.title))]),t._v(" "),e("p",[t._v(t._s(n.details))])])})),0):t._e(),t._v(" "),e("Content",{staticClass:"theme-default-content custom"}),t._v(" "),t.data.footer?e("div",{staticClass:"footer"},[t._v("\n "+t._s(t.data.footer)+"\n ")]):e("Content",{staticClass:"footer",attrs:{"slot-key":"footer"}})],1)}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/17.6cd3a12a.js b/assets/js/17.6cd3a12a.js new file mode 100644 index 0000000..57cfa5e --- /dev/null +++ b/assets/js/17.6cd3a12a.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return c})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return d})),n.d(e,"e",(function(){return p})),n.d(e,"k",(function(){return f})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return m})),n.d(e,"j",(function(){return b}));n(92);const i=/#.*$/,r=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function c(t){return s.test(t)}function u(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function d(t){if(c(t))return t;const e=t.match(i),n=e?e[0]:"",r=o(t);return a.test(r)?t:r+".html"+n}function p(t,e){const n=decodeURIComponent(t.hash),r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return o(t.path)===o(e)}function f(t,e,n){if(c(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,i,r=1){if("string"==typeof e)return f(n,e,i);if(Array.isArray(e))return Object.assign(f(n,e[0],i),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(f(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(t,r,n)):[]}return[]}function g(t){const e=m(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function m(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function b(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},253:function(t,e){t.exports=function(t){return null==t}},255:function(t,e,n){},266:function(t,e,n){"use strict";n(255)},274:function(t,e,n){"use strict";n.r(e);var i=n(253),r=n.n(i),a=n(246),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=r()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:i="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,i,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,i,r){if(/bitbucket.org/.test(e)){return e.replace(a.a,"")+"/src"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r+`?mode=edit&spa=0&at=${i}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(a.a,"")+"/-/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}return(a.i.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}}},o=(n(266),n(8)),c=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/18.8d7e6487.js b/assets/js/18.8d7e6487.js new file mode 100644 index 0000000..2d70f93 --- /dev/null +++ b/assets/js/18.8d7e6487.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return o})),n.d(e,"g",(function(){return c})),n.d(e,"h",(function(){return l})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return d})),n.d(e,"l",(function(){return h})),n.d(e,"c",(function(){return g})),n.d(e,"j",(function(){return m}));n(92);const r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function u(t){return decodeURI(t).replace(r,"").replace(i,"")}function o(t){return s.test(t)}function c(t){return/^mailto:/.test(t)}function l(t){return/^tel:/.test(t)}function p(t){if(o(t))return t;const e=t.match(r),n=e?e[0]:"",i=u(t);return a.test(i)?t:i+".html"+n}function f(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return u(t.path)===u(e)}function d(t,e,n){if(o(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return d(n,e,r);if(Array.isArray(e))return Object.assign(d(n,e[0],r),{title:e[1]});{const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},252:function(t,e,n){},259:function(t,e,n){"use strict";n(252)},262:function(t,e,n){"use strict";n.r(e);var r=n(246);function i(t,e,n,r,i){const a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(a.style={"padding-left":i+"rem"}),t("RouterLink",a,n)}function a(t,e,n,s,u,o=1){return!e||o>u?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const c=Object(r.e)(s,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,c,e.level-1),a(t,e.children,n,s,u,o+1)])}))}var s={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:s,$themeConfig:u,$themeLocaleConfig:o},props:{item:c,sidebarDepth:l}}){const p=Object(r.e)(s,c.path),f="auto"===c.type?p||c.children.some(t=>Object(r.e)(s,c.basePath+"#"+t.slug)):p,d="external"===c.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,c.path,c.title||c.path):i(t,c.path,c.title||c.path,f),h=[e.frontmatter.sidebarDepth,l,o.sidebarDepth,u.sidebarDepth,1].find(t=>void 0!==t),b=o.displayAllHeaders||u.displayAllHeaders;if("auto"===c.type)return[d,a(t,c.children,c.basePath,s,h)];if((f||b)&&c.headers&&!r.d.test(c.path)){return[d,a(t,Object(r.c)(c.headers),c.path,s,h)]}return d}},u=(n(259),n(8)),o=Object(u.a)(s,void 0,void 0,!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/19.78b16bd4.js b/assets/js/19.78b16bd4.js new file mode 100644 index 0000000..6110e42 --- /dev/null +++ b/assets/js/19.78b16bd4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{247:function(t,e,n){},249:function(t,e,n){"use strict";n.r(e);var s={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(250),n(8)),o=Object(i.a)(s,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=o.exports},250:function(t,e,n){"use strict";n(247)}}]); \ No newline at end of file diff --git a/assets/js/2.99da59a7.js b/assets/js/2.99da59a7.js new file mode 100644 index 0000000..e9f7431 --- /dev/null +++ b/assets/js/2.99da59a7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{252:function(t,e,a){},253:function(t,e){t.exports=function(t){return null==t}},255:function(t,e,a){},256:function(t,e,a){},257:function(t,e,a){},259:function(t,e,a){"use strict";a(252)},260:function(t,e,a){"use strict";a.r(e);var n=a(273),s=a(262),i=a(246);function r(t,e){if("group"===e.type){const a=e.path&&Object(i.e)(t,e.path),n=e.children.some(e=>"group"===e.type?r(t,e):"page"===e.type&&Object(i.e)(t,e.path));return a||n}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:n.default,SidebarLink:s.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let a=0;a-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(i.e)(this.$route,t.regularPath)}}},l=a(8),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(a,n){return e("li",{key:n},["group"===a.type?e("SidebarGroup",{attrs:{item:a,open:n===t.openGroupIndex,collapsable:a.collapsable||a.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(n)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:a}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},262:function(t,e,a){"use strict";a.r(e);var n=a(246);function s(t,e,a,n,s){const i={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:n,"sidebar-link":!0}};return s>2&&(i.style={"padding-left":s+"rem"}),t("RouterLink",i,a)}function i(t,e,a,r,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(n.e)(r,a+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[s(t,a+"#"+e.slug,e.title,u,e.level-1),i(t,e.children,a,r,o,l+1)])}))}var r={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:a,$route:r,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(n.e)(r,u.path),d="auto"===u.type?p||u.children.some(t=>Object(n.e)(r,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,a){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[a,t("OutboundLink")])}(t,u.path,u.title||u.path):s(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,i(t,u.children,u.basePath,r,f)];if((d||b)&&u.headers&&!n.d.test(u.path)){return[h,i(t,Object(n.c)(u.headers),u.path,r,f)]}return h}},o=(a(259),a(8)),l=Object(o.a)(r,void 0,void 0,!1,null,null,null);e.default=l.exports},263:function(t,e,a){},266:function(t,e,a){"use strict";a(255)},267:function(t,e,a){var n=a(12),s=a(4),i=a(11);t.exports=function(t){return"string"==typeof t||!s(t)&&i(t)&&"[object String]"==n(t)}},268:function(t,e,a){"use strict";a(256)},269:function(t,e,a){},270:function(t,e,a){"use strict";a(257)},271:function(t,e,a){},273:function(t,e,a){"use strict";a.r(e);var n=a(246),s={name:"SidebarGroup",components:{DropdownTransition:a(249).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=a(260).default},methods:{isActive:n.e}},i=(a(270),a(8)),r=Object(i.a)(s,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=r.exports},274:function(t,e,a){"use strict";a.r(e);var n=a(253),s=a.n(n),i=a(246),r={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=s()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:a="",docsBranch:n="master",docsRepo:i=e}=this.$site.themeConfig;return t&&i&&this.$page.relativePath?this.createEditLink(e,i,a,n,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,a,n,s){if(/bitbucket.org/.test(e)){return e.replace(i.a,"")+"/src"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s+`?mode=edit&spa=0&at=${n}&fileviewer=file-view-default`}if(/gitlab.com/.test(e)){return e.replace(i.a,"")+"/-/edit"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s}return(i.i.test(e)?e:"https://github.com/"+e).replace(i.a,"")+"/edit"+`/${n}/`+(a?a.replace(i.a,"")+"/":"")+s}}},o=(a(266),a(8)),l=Object(o.a)(r,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=l.exports},275:function(t,e,a){"use strict";a.r(e);a(92);var n=a(246),s=a(267),i=a.n(s),r=a(253),o=a.n(r),l={name:"PageNav",props:["sidebarItems"],computed:{prev(){return c(u.PREV,this)},next(){return c(u.NEXT,this)}}};const u={NEXT:{resolveLink:function(t,e){return p(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return p(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function c(t,{$themeConfig:e,$page:a,$route:s,$site:r,sidebarItems:l}){const{resolveLink:u,getThemeLinkConfig:c,getPageLinkConfig:p}=t,d=c(e),h=p(a),f=o()(h)?d:h;return!1===f?void 0:i()(f)?Object(n.k)(r.pages,f,s.path):u(a,l)}function p(t,e,a){const n=[];!function t(e,a){for(let n=0,s=e.length;n({isSidebarOpen:!1}),computed:{shouldShowNavbar(){const{themeConfig:t}=this.$site,{frontmatter:e}=this.$page;return!1!==e.navbar&&!1!==t.navbar&&(this.$title||t.logo||t.repo||t.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:t}=this.$page;return!t.home&&!1!==t.sidebar&&this.sidebarItems.length},sidebarItems(){return Object(o.l)(this.$page,this.$page.regularPath,this.$site,this.$localePath)},pageClasses(){const t=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},t]}},mounted(){this.$router.afterEach(()=>{this.isSidebarOpen=!1})},methods:{toggleSidebar(t){this.isSidebarOpen="boolean"==typeof t?t:!this.isSidebarOpen,this.$emit("toggle-sidebar",this.isSidebarOpen)},onTouchStart(t){this.touchStart={x:t.changedTouches[0].clientX,y:t.changedTouches[0].clientY}},onTouchEnd(t){const e=t.changedTouches[0].clientX-this.touchStart.x,a=t.changedTouches[0].clientY-this.touchStart.y;Math.abs(e)>Math.abs(a)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}},u=a(8),c=Object(u.a)(l,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?e("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),e("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),e("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),t.$page.frontmatter.home?e("Home"):e("Page",{attrs:{"sidebar-items":t.sidebarItems},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("page-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("page-bottom")]},proxy:!0}],null,!0)})],1)}),[],!1,null,null,null);e.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/20.a3f134b4.js b/assets/js/20.a3f134b4.js new file mode 100644 index 0000000..0811f39 --- /dev/null +++ b/assets/js/20.a3f134b4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{265:function(t,c,n){},277:function(t,c,n){"use strict";n(265)},290:function(t,c,n){"use strict";n.r(c);n(277);var i=n(8),s=Object(i.a)({},(function(){var t=this,c=t._self._c;return c("div",{staticClass:"sidebar-button",on:{click:function(c){return t.$emit("toggle-sidebar")}}},[c("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[c("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null);c.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/21.09978d66.js b/assets/js/21.09978d66.js new file mode 100644 index 0000000..186b799 --- /dev/null +++ b/assets/js/21.09978d66.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{301:function(a,t,s){a.exports=s.p+"assets/img/harbor_login_page.703b5e90.png"},302:function(a,t,s){a.exports=s.p+"assets/img/harbor_projects.338db00b.png"},322:function(a,t,s){"use strict";s.r(t);var e=s(8),r=Object(e.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"install-harbor"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-harbor"}},[a._v("#")]),a._v(" Install Harbor")]),a._v(" "),t("p",[t("img",{attrs:{src:"https://raw.githubusercontent.com/cncf/artwork/c33a8386bce4eabc36e1d4972e0996db4630037b/projects/harbor/horizontal/color/harbor-horizontal-color.svg?sanitize=true",alt:"Harbor logo",title:"Harbor logo"}})]),a._v(" "),t("p",[a._v("Label Harbor namespace and copy there the secret with certificates signed by\nLet's Encrypt certificate:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl create namespace harbor\nkubectl label namespace harbor "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("app")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("kubed\n")])])]),t("p",[a._v('Create Istio Gateways and VirtualServices to allow accessing Harbor from\n"outside":')]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" -")]),a._v("\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n name: harbor-gateway\n namespace: harbor\nspec:\n selector:\n istio: ingressgateway\n servers:\n - port:\n number: 80\n name: http-harbor\n protocol: HTTP\n hosts:\n - harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n - port:\n number: 443\n name: https-harbor\n protocol: HTTPS\n hosts:\n - harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n - notary."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n tls:\n mode: PASSTHROUGH\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: harbor-http-virtual-service\n namespace: harbor\nspec:\n hosts:\n - harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n gateways:\n - harbor-gateway\n http:\n - match:\n - port: 80\n route:\n - destination:\n host: harbor.harbor.svc.cluster.local\n port:\n number: 80\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: harbor-https-virtual-service\n namespace: harbor\nspec:\n hosts:\n - harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n gateways:\n - harbor-gateway\n tls:\n - match:\n - port: 443\n sniHosts:\n - harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n route:\n - destination:\n host: harbor.harbor.svc.cluster.local\n port:\n number: 443\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: harbor-notary-virtual-service\n namespace: harbor\nspec:\n hosts:\n - notary."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n gateways:\n - harbor-gateway\n tls:\n - match:\n - port: 443\n sniHosts:\n - notary."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n route:\n - destination:\n host: harbor.harbor.svc.cluster.local\n port:\n number: 4443\nEOF")]),a._v("\n")])])]),t("p",[a._v("Add Harbor Helm repository:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm repo "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("add")]),a._v(" harbor https://helm.goharbor.io\nhelm repo update\n")])])]),t("p",[a._v("Install Harbor using Helm:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" harbor harbor/harbor "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--namespace")]),a._v(" harbor "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--version")]),a._v(" v1.2.3 "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("expose.tls.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("expose.tls.secretName")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("ingress-cert-"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("expose.type")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("clusterIP "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("externalURL")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("https://harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("harborAdminPassword")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("admin "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("persistence.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("NAME: harbor\nLAST DEPLOYED: Fri Dec 27 10:54:23 2019\nNAMESPACE: harbor\nSTATUS: deployed\nREVISION: 1\nTEST SUITE: None\nNOTES:\nPlease wait for several minutes for Harbor deployment to complete.\nThen you should be able to visit the Harbor portal at https://harbor.mylabs.dev.\nFor more details, please visit https://github.com/goharbor/harbor.\n")])])]),t("p",[a._v("Open the "),t("a",{attrs:{href:"https://harbor.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://harbor.mylabs.dev"),t("OutboundLink")],1),a._v(":")]),a._v(" "),t("p",[t("img",{attrs:{src:s(301),alt:"Harbor login page",title:"Harbor login page"}})]),a._v(" "),t("p",[a._v("Log in:")]),a._v(" "),t("ul",[t("li",[a._v("User: "),t("code",[a._v("admin")])]),a._v(" "),t("li",[a._v("Password: "),t("code",[a._v("admin")])])]),a._v(" "),t("p",[a._v("You should see the Web UI:")]),a._v(" "),t("p",[t("img",{attrs:{src:s(302),alt:"Harbor",title:"Harbor"}})]),a._v(" "),t("p",[a._v("Create new robot account for "),t("code",[a._v("library")]),a._v(" project:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("HARBOR_ROBOT_TOKEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-k")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-u")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"admin:admin"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://harbor.'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('/api/projects/1/robots"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{\n '),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("name"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("myrobot"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(",\n "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("description"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("Robot account with Push/Pull access to library project"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(",\n "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("access"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(": [\n {\n "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("resource"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("/project/1/repository"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(",\n "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("action"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("push"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v('\n }\n ]\n}"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-r")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('".token"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${HARBOR_ROBOT_TOKEN}")]),a._v("\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("eyJhbGciO .... oOFJvwidsQ\n")])])]),t("p",[a._v('Enable automated vulnerability scan after each "image push" to the project\n'),t("code",[a._v("library")]),a._v(":")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-k")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-u")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"admin:admin"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" PUT "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://harbor.'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('/api/projects/1"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{\n '),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("metadata"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(": {\n "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("auto_scan"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("true"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v('\n }\n}"')]),a._v("\n")])])]),t("p",[a._v("Test Harbor functionality by uploading docker image (optional):")]),a._v(" "),t("div",{staticClass:"language-shell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"staging"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("SSL_CERT_FILE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$PWD")]),a._v("/tmp/fakelerootx1.pem\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" pull gcr.io/kuar-demo/kuard-amd64:blue\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" tag gcr.io/kuar-demo/kuard-amd64:blue harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/library/kuard-amd64:blue\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$HARBOR_ROBOT_TOKEN")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" login "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--username")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"robot\\'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$myrobot")]),a._v('"')]),a._v(" --password-stdin harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" push harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/library/kuard-amd64:blue\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" tag gcr.io/kuar-demo/kuard-amd64:blue harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/library/kuard-amd64:blue2\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" admin "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" login "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--username")]),a._v(" admin --password-stdin harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("DOCKER_CONTENT_TRUST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("DOCKER_CONTENT_TRUST_SERVER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("https://notary."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"mypassphrase123"')]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"rootpassphrase123"')]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" push harbor."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/library/kuard-amd64:blue2\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("unset")]),a._v(" DOCKER_CONTENT_TRUST\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("unset")]),a._v(" SSL_CERT_FILE\n")])])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/22.cd6b7b59.js b/assets/js/22.cd6b7b59.js new file mode 100644 index 0000000..e1437d8 --- /dev/null +++ b/assets/js/22.cd6b7b59.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{307:function(e,t,a){e.exports=a.p+"assets/img/GitHub_Webhooks.3cdaed97.png"},308:function(e,t,a){e.exports=a.p+"assets/img/GitHub_Webhooks-Details.da577fc5.png"},327:function(e,t,a){"use strict";a.r(t);var s=a(8),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"automated-deployment-with-tekton"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automated-deployment-with-tekton"}},[e._v("#")]),e._v(" Automated deployment with Tekton")]),e._v(" "),t("p",[e._v("Take a real example "),t("a",{attrs:{href:"https://github.com/stefanprodan/podinfo",target:"_blank",rel:"noopener noreferrer"}},[e._v("Podinfo"),t("OutboundLink")],1),e._v("\napplication and create full pipeline for it...")]),e._v(" "),t("h2",{attrs:{id:"fork-podinfo-application"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fork-podinfo-application"}},[e._v("#")]),e._v(" Fork podinfo application")]),e._v(" "),t("p",[e._v("Fork the "),t("a",{attrs:{href:"https://github.com/stefanprodan/podinfo",target:"_blank",rel:"noopener noreferrer"}},[e._v("Podinfo"),t("OutboundLink")],1),e._v(" repository\n"),t("code",[e._v("podinfo")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" tmp\nhub clone "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"stefanprodan/podinfo"')]),e._v("\nhub "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-C")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"podinfo"')]),e._v(" fork\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("Cloning into 'podinfo'...\nremote: Enumerating objects: 10, done.\nremote: Counting objects: 100% (10/10), done.\nremote: Compressing objects: 100% (10/10), done.\nremote: Total 5266 (delta 0), reused 3 (delta 0), pack-reused 5256\nReceiving objects: 100% (5266/5266), 9.52 MiB | 1.93 MiB/s, done.\nResolving deltas: 100% (2342/2342), done.\nUpdating ruzickap\nFrom https://github.com/stefanprodan/podinfo\n * [new branch] gh-pages -> ruzickap/gh-pages\n * [new branch] master -> ruzickap/master\n * [new branch] v0.x -> ruzickap/v0.x\n * [new branch] v1.x -> ruzickap/v1.x\n * [new branch] v3.x -> ruzickap/v3.x\nnew remote: ruzickap\n")])])]),t("h2",{attrs:{id:"create-tekton-triggers-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-tekton-triggers-configuration"}},[e._v("#")]),e._v(" Create Tekton Triggers configuration")]),e._v(" "),t("p",[e._v("Create new namespace:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("kubectl create namespace getting-started\n")])])]),t("p",[e._v("Create the admin user, role and rolebinding:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<<")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -")]),e._v('\nkind: Role\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: tekton-triggers-admin\n namespace: getting-started\nrules:\n- apiGroups:\n - tekton.dev\n resources:\n - eventlisteners\n - triggerbindings\n - triggertemplates\n - pipelineresources\n verbs:\n - get\n- apiGroups:\n - tekton.dev\n resources:\n - pipelineruns\n - pipelineresources\n verbs:\n - create\n- apiGroups:\n - ""\n resources:\n - configmaps\n verbs:\n - get\n - list\n - watch\n- apiGroups:\n - apps\n resources:\n - deployments\n verbs:\n - get\n - list\n - watch\n - create\n - patch\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: tekton-triggers-admin\n namespace: getting-started\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n name: tekton-triggers-admin-binding\n namespace: getting-started\nsubjects:\n - kind: ServiceAccount\n name: tekton-triggers-admin\nroleRef:\n apiGroup: rbac.authorization.k8s.io\n kind: Role\n name: tekton-triggers-admin\nEOF')]),e._v("\n")])])]),t("p",[e._v("Create the "),t("code",[e._v("create-webhook")]),e._v(" user, role and rolebinding:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<<")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -")]),e._v('\nkind: Role\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: tekton-triggers-createwebhook\n namespace: getting-started\nrules:\n- apiGroups:\n - ""\n resources:\n - secrets\n verbs:\n - get\n - list\n - create\n - update\n - delete\n- apiGroups:\n - tekton.dev\n resources:\n - eventlisteners\n verbs:\n - get\n - list\n - create\n - update\n - delete\n- apiGroups:\n - networking.istio.io\n resources:\n - virtualservices\n - gateways\n verbs:\n - create\n - get\n - list\n - delete\n - update\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: tekton-triggers-createwebhook\n namespace: getting-started\n---\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n name: tekton-triggers-createwebhook\n namespace: getting-started\nsubjects:\n - kind: ServiceAccount\n name: tekton-triggers-createwebhook\nroleRef:\n apiGroup: rbac.authorization.k8s.io\n kind: Role\n name: tekton-triggers-createwebhook\nEOF')]),e._v("\n")])])]),t("p",[e._v("Create secret for Harbor registry to let Tekton pipeline to upload the container\nimage:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("kubectl create secret docker-registry "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started harbor-docker-config "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n --docker-server"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${CONTAINER_REGISTRY_SERVER}")]),e._v('"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n --docker-username"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${CONTAINER_REGISTRY_USERNAME}")]),e._v('"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n --docker-password"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${CONTAINER_REGISTRY_PASSWORD}")]),e._v('"')]),e._v("\n")])])]),t("p",[e._v("Install the Pipeline:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<<")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("EOF "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -\napiVersion: tekton.dev/v1alpha1\nkind: Task\nmetadata:\n name: build-docker-image-from-git-task\n namespace: getting-started\nspec:\n inputs:\n resources:\n - name: docker-source\n type: "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v("\n params:\n - name: pathToDockerFile\n description: The path to the dockerfile to build\n default: /workspace/docker-source/Dockerfile\n - name: pathToContext\n description:\n The build context used by Kaniko\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("https://github.com/GoogleContainerTools/kaniko"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("#kaniko-build-contexts)")]),e._v("\n default: /workspace/docker-source\n outputs:\n resources:\n - name: image-source\n type: image\n volumes:\n - name: docker-config\n secret:\n secretName: harbor-docker-config\n items:\n - key: .dockerconfigjson\n path: config.json\n - name: shared-storage\n emptyDir: "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n steps:\n - name: build\n image: gcr.io/kaniko-project/executor\n env:\n - name: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"DOCKER_CONFIG"')]),e._v("\n value: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/builder/home/.docker/"')]),e._v("\n command:\n - /kaniko/executor\n args:\n - "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--dockerfile")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.pathToDockerFile"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n - "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--destination")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("outputs.resources.image-source.url"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n - "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--context")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.pathToContext"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n - --skip-tls-verify\n volumeMounts:\n - name: docker-config\n mountPath: /builder/home/.docker/\n---\napiVersion: tekton.dev/v1alpha1\nkind: Task\nmetadata:\n name: deploy-locally\n namespace: getting-started\nspec:\n inputs:\n resources:\n - name: image-source\n type: image\n outputs:\n resources:\n - name: event-to-sink\n type: cloudEvent\n steps:\n - name: run-kubectl\n image: lachlanevenson/k8s-kubectl:latest\n command:\n - "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sh")]),e._v("\n args:\n - "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ce")]),e._v("\n - "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("set")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ex")]),e._v("\n kubectl run podinfo "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--image")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.resources.image-source.url"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-o")]),e._v(" yaml --dry-run "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -\n---\napiVersion: tekton.dev/v1alpha1\nkind: Pipeline\nmetadata:\n name: getting-started-pipeline\n namespace: getting-started\nspec:\n resources:\n - name: docker-source\n type: "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v("\n - name: image-source\n type: image\n - name: event-to-sink\n type: cloudEvent\n tasks:\n - name: build-docker-image-from-git-task-run\n taskRef:\n name: build-docker-image-from-git-task\n params:\n - name: pathToDockerFile\n value: Dockerfile\n - name: pathToContext\n value: /workspace/docker-source/\n resources:\n inputs:\n - name: docker-source\n resource: docker-source\n outputs:\n - name: image-source\n resource: image-source\n - name: deploy-locally\n taskRef:\n name: deploy-locally\n resources:\n inputs:\n - name: image-source\n resource: image-source\n from:\n - build-docker-image-from-git-task-run\n outputs:\n - name: event-to-sink\n resource: event-to-sink\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: event-display\n namespace: getting-started\n labels:\n app: event-display\nspec:\n type: ClusterIP\n ports:\n - name: listener\n port: "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("8080")]),e._v("\n protocol: TCP\n selector:\n app: event-display\n---\n apiVersion: v1\n kind: Pod\n metadata:\n name: event-display\n namespace: getting-started\n labels:\n name: event-display\n spec:\n hostname: event-display\n containers:\n - image: gcr.io/knative-releases/github.com/knative/eventing-sources/cmd/event_display\n name: web\nEOF\n")])])]),t("p",[e._v("Install the TriggerTemplate, TriggerBinding and EventListener:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<<")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -")]),e._v("\napiVersion: tekton.dev/v1alpha1\nkind: TriggerTemplate\nmetadata:\n name: getting-started-triggertemplate\n namespace: getting-started\nspec:\n params:\n - name: gitrevision\n description: The git revision\n default: master\n - name: gitrepositoryurl\n description: The git repository url\n - name: image_registry_url\n description: The container registry url\n - name: namespace\n description: The namespace to create the resources\n resourcetemplates:\n - apiVersion: tekton.dev/v1alpha1\n kind: PipelineResource\n metadata:\n name: source-repo-\\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("uid"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n namespace: \\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("params.namespace"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n spec:\n type: git\n params:\n - name: revision\n value: \\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("params.gitrevision"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n - name: url\n value: \\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("params.gitrepositoryurl"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n - apiVersion: tekton.dev/v1alpha1\n kind: PipelineResource\n metadata:\n name: image-source-\\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("uid"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n namespace: \\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("params.namespace"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n spec:\n type: image\n params:\n - name: url\n value: \\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("params.image_registry_url"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n - apiVersion: tekton.dev/v1alpha1\n kind: PipelineResource\n metadata:\n name: event-to-sink-\\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("uid"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n namespace: \\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("params.namespace"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n spec:\n type: cloudEvent\n params:\n - name: targetURI\n value: http://event-display.getting-started.svc.cluster.local\n - apiVersion: tekton.dev/v1alpha1\n kind: PipelineRun\n metadata:\n name: getting-started-pipeline-run-\\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("uid"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n namespace: \\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("params.namespace"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n spec:\n serviceAccount: tekton-triggers-admin\n pipelineRef:\n name: getting-started-pipeline\n resources:\n - name: docker-source\n resourceRef:\n name: source-repo-\\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("uid"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n - name: image-source\n resourceRef:\n name: image-source-\\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("uid"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n - name: event-to-sink\n resourceRef:\n name: event-to-sink-\\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("uid"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n---\napiVersion: tekton.dev/v1alpha1\nkind: TriggerBinding\nmetadata:\n name: getting-started-pipelinebinding\n namespace: getting-started\nspec:\n params:\n - name: gitrevision\n value: \\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("body.head_commit.id"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v('\n - name: namespace\n value: getting-started\n - name: gitrepositoryurl\n value: "https://github.com/\\'),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("body.repository.full_name"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v('"\n - name: image_registry_url\n value: "harbor.'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${MY_DOMAIN}")]),e._v("/library/\\"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("body.repository.name"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v('"\n---\napiVersion: tekton.dev/v1alpha1\nkind: EventListener\nmetadata:\n name: getting-started-listener\n namespace: getting-started\nspec:\n serviceAccountName: tekton-triggers-admin\n triggers:\n - binding:\n name: getting-started-pipelinebinding\n template:\n name: getting-started-triggertemplate\nEOF')]),e._v("\n")])])]),t("h3",{attrs:{id:"configure-webhook"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configure-webhook"}},[e._v("#")]),e._v(" Configure webhook")]),e._v(" "),t("p",[e._v("Create Task which will create Istio Gateway and VirtualService to handle\nincoming webhook form GitHub:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<<")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("EOF2 "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -\napiVersion: tekton.dev/v1alpha1\nkind: Task\nmetadata:\n name: create-istio-gateway-virtualservice\n namespace: getting-started\nspec:\n volumes:\n - name: work\n emptyDir: "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n\n inputs:\n params:\n - name: TLScredentialName\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Specify the secret with wildcard certificate"')]),e._v("\n - name: ExternalDomain\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The external domain for the EventListener"')]),e._v("\n - name: Service\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The name of the Service used in the VirtualService"')]),e._v("\n - name: ServicePort\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The service port that the VirtualService is being created on"')]),e._v("\n\n steps:\n - name: create-istio-gateway-virtualservice\n image: lachlanevenson/k8s-kubectl:latest\n command:\n - "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sh")]),e._v("\n args:\n - "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ce")]),e._v("\n - "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("set")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ex")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<<")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl create "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -")]),e._v("\n apiVersion: networking.istio.io/v1alpha3\n kind: Gateway\n metadata:\n name: "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.Service"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("-gateway\n spec:\n selector:\n istio: ingressgateway\n servers:\n - port:\n number: 443\n name: https-"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.Service"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n protocol: HTTPS\n hosts:\n - "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.ExternalDomain"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n tls:\n credentialName: "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.TLScredentialName"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n mode: SIMPLE\n privateKey: sds\n serverCertificate: sds\n ---\n apiVersion: networking.istio.io/v1alpha3\n kind: VirtualService\n metadata:\n name: "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.Service"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("-virtual-service\n spec:\n hosts:\n - "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.ExternalDomain"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n gateways:\n - "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.Service"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("-gateway\n http:\n - route:\n - destination:\n host: "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.Service"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n port:\n number: "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.ServicePort"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n EOF\nEOF")]),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v("\n")])])]),t("p",[e._v("Create TaskRun to start "),t("code",[e._v("create-istio-gateway-virtualservice")]),e._v(" Task:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<<")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -")]),e._v("\napiVersion: tekton.dev/v1alpha1\nkind: TaskRun\nmetadata:\n name: create-istio-gateway-virtualservice-run\n namespace: getting-started\nspec:\n taskRef:\n name: create-istio-gateway-virtualservice\n inputs:\n params:\n - name: TLScredentialName\n value: ingress-cert-"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${LETSENCRYPT_ENVIRONMENT}")]),e._v("\n - name: ExternalDomain\n value: getting-started."),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${MY_DOMAIN}")]),e._v('\n - name: Service\n value: el-getting-started-listener\n - name: ServicePort\n value: "8080"\n timeout: 1000s\n serviceAccount: tekton-triggers-createwebhook\nEOF')]),e._v("\n")])])]),t("p",[e._v("Create webhook Task:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<<")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("EOF "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -\napiVersion: tekton.dev/v1alpha1\nkind: Task\nmetadata:\n name: create-webhook\n namespace: getting-started\nspec:\n volumes:\n - name: github-secret\n secret:\n secretName: "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.GitHubSecretName"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n\n inputs:\n params:\n - name: ExternalDomain\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The external domain for the EventListener e.g. '),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.EventListenerName"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("."),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("PROXYIP"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(".nip.io"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("`")])]),e._v('"')]),e._v("\n - name: GitHubUser\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The GitHub user"')]),e._v("\n - name: GitHubRepo\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The GitHub repo where the webhook will be created"')]),e._v("\n - name: GitHubOrg\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The GitHub organization where the webhook will be created"')]),e._v("\n - name: GitHubSecretName\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The Secret name for GitHub access token. This is always mounted and must exist"')]),e._v("\n - name: GitHubAccessTokenKey\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The GitHub access token key name"')]),e._v("\n - name: GitHubSecretStringKey\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The GitHub secret string key name"')]),e._v("\n - name: GitHubDomain\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"The GitHub domain. Override for GitHub Enterprise"')]),e._v("\n default: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"github.com"')]),e._v("\n - name: WebhookEvents\n description: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"List of events the webhook will send notifications for"')]),e._v("\n default: "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"['),t("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[e._v("\\\\")]),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("push"),t("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[e._v("\\\\")]),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(","),t("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[e._v("\\\\")]),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("pull_request"),t("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[e._v("\\\\")]),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(']"')]),e._v("\n\n steps:\n - name: create-webhook\n image: pstauffer/curl:latest\n volumeMounts:\n - name: github-secret\n mountPath: /var/secret\n command:\n - "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sh")]),e._v("\n args:\n - "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ce")]),e._v("\n - "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("set")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-e")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Create Webhook"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.GitHubDomain"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"github.com"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("then")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-v")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{'),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("name"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("web"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(","),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("active"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": true,"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("events"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.WebhookEvents"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(","),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("config"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": {"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("url"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("https://"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.ExternalDomain"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(","),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("content_type"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("json"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(","),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("insecure_ssl"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("1"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(" ,"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("secret"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" /var/secret/"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("$(")]),e._v("inputs.params.GitHubSecretStringKey"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v('}}"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-X")]),e._v(" POST "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-u")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.GitHubUser"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" /var/secret/"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("$(")]),e._v("inputs.params.GitHubAccessTokenKey"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-L")]),e._v(" https://api.github.com/repos/"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.GitHubOrg"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("/"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.GitHubRepo"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("/hooks\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("else")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{'),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("name"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("web"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(","),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("active"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": true,"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("events"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.WebhookEvents"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(","),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("config"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": {"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("url"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("https://"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.ExternalDomain"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("/"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(","),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("content_type"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("json"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(","),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("insecure_ssl"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("1"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(" ,"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v("secret"),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v(": "),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" /var/secret/"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("$(")]),e._v("inputs.params.GitHubSecretStringKey"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),t("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[e._v('\\"')]),e._v('}}"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-X")]),e._v(" POST "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-u")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.GitHubUser"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" /var/secret/"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("$(")]),e._v("inputs.params.GitHubAccessTokenKey"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-L")]),e._v(" https://"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.GitHubDomain"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("/api/v3/repos/"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.GitHubOrg"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("/"),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("inputs.params.GitHubRepo"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("/hooks\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("fi")]),e._v("\nEOF\n")])])]),t("p",[e._v("Create secret with "),t("a",{attrs:{href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Personal Access Token"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<<")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -")]),e._v("\napiVersion: v1\nkind: Secret\nmetadata:\n name: webhook-secret\n namespace: getting-started\nstringData:\n token: "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${GITHUB_TOKEN}")]),e._v("\n secret: random-string-data\nEOF")]),e._v("\n")])])]),t("p",[e._v("Create TaskRun to initiate Webhook:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sleep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("20")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Wait for DNS created by previous TaskRun")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<<")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" -")]),e._v('\napiVersion: tekton.dev/v1alpha1\nkind: TaskRun\nmetadata:\n name: create-webhook-run\n namespace: getting-started\nspec:\n taskRef:\n name: create-webhook\n inputs:\n params:\n - name: GitHubOrg\n value: "ruzickap"\n - name: GitHubUser\n value: "ruzickap"\n - name: GitHubRepo\n value: "podinfo"\n - name: GitHubSecretName\n value: webhook-secret\n - name: GitHubAccessTokenKey\n value: token\n - name: GitHubSecretStringKey\n value: secret\n - name: ExternalDomain\n value: getting-started.'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${MY_DOMAIN}")]),e._v("\n timeout: 1000s\n serviceAccount: tekton-triggers-createwebhook\nEOF")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sleep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v("\n")])])]),t("p",[e._v("Verify if the TaskRuns were successfully executed:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("kubectl get taskruns.tekton.dev "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME\ncreate-istio-gateway-virtualservice-run True Succeeded 80s 71s\ncreate-webhook-run Unknown Pending 2s\n")])])]),t("p",[e._v("Look at the logs from "),t("code",[e._v("create-istio-gateway-virtualservice")]),e._v(" TaskRun:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("tkn taskrun logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started create-istio-gateway-virtualservice-run\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("[create-istio-gateway-virtualservice] + + kubectl create -f -\n[create-istio-gateway-virtualservice] cat\n[create-istio-gateway-virtualservice] gateway.networking.istio.io/el-getting-started-listener-gateway created\n[create-istio-gateway-virtualservice] virtualservice.networking.istio.io/el-getting-started-listener-virtual-service created\n")])])]),t("p",[e._v("Look at the logs from "),t("code",[e._v("create-webhook-run")]),e._v(" TaskRun:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("tkn taskrun logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started create-webhook-run\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('[create-webhook] Create Webhook\n[create-webhook] Note: Unnecessary use of -X or --request, POST is already inferred.\n[create-webhook] % Total % Received % Xferd Average Speed Time Time Time Current\n[create-webhook] Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 140.82.118.6...\n[create-webhook] * TCP_NODELAY set\n[create-webhook] * Connected to api.github.com (140.82.118.6) port 443 (#0)\n[create-webhook] * ALPN, offering h2\n[create-webhook] * ALPN, offering http/1.1\n[create-webhook] * successfully set certificate verify locations:\n[create-webhook] * CAfile: /etc/ssl/certs/ca-certificates.crt\n[create-webhook] CApath: none\n[create-webhook] * TLSv1.2 (OUT), TLS handshake, Client hello (1):\n[create-webhook] } [232 bytes data]\n[create-webhook] * TLSv1.2 (IN), TLS handshake, Server hello (2):\n[create-webhook] { [108 bytes data]\n[create-webhook] * TLSv1.2 (IN), TLS handshake, Certificate (11):\n[create-webhook] { [2851 bytes data]\n[create-webhook] * TLSv1.2 (IN), TLS handshake, Server key exchange (12):\n[create-webhook] { [300 bytes data]\n[create-webhook] * TLSv1.2 (IN), TLS handshake, Server finished (14):\n[create-webhook] { [4 bytes data]\n[create-webhook] * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):\n[create-webhook] } [37 bytes data]\n[create-webhook] * TLSv1.2 (OUT), TLS change cipher, Client hello (1):\n[create-webhook] } [1 bytes data]\n[create-webhook] * TLSv1.2 (OUT), TLS handshake, Finished (20):\n[create-webhook] } [16 bytes data]\n[create-webhook] * TLSv1.2 (IN), TLS change cipher, Client hello (1):\n[create-webhook] { [1 bytes data]\n[create-webhook] * TLSv1.2 (IN), TLS handshake, Finished (20):\n[create-webhook] { [16 bytes data]\n[create-webhook] * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256\n[create-webhook] * ALPN, server accepted to use http/1.1\n[create-webhook] * Server certificate:\n[create-webhook] * subject: C=US; ST=California; L=San Francisco; O=GitHub, Inc.; CN=*.github.com\n[create-webhook] * start date: Jul 8 00:00:00 2019 GMT\n[create-webhook] * expire date: Jul 16 12:00:00 2020 GMT\n[create-webhook] * subjectAltName: host "api.github.com" matched cert\'s "*.github.com"\n[create-webhook] * issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=DigiCert SHA2 High Assurance Server CA\n[create-webhook] * SSL certificate verify ok.\n[create-webhook] * Server auth using Basic with user \'ruzickap\'\n[create-webhook] > POST /repos/ruzickap/podinfo/hooks HTTP/1.1\n[create-webhook] > Host: api.github.com\n[create-webhook] > Authorization: Basic cnxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxU3MA==\n[create-webhook] > User-Agent: curl/7.60.0\n[create-webhook] > Accept: */*\n[create-webhook] > Content-Length: 195\n[create-webhook] > Content-Type: application/x-www-form-urlencoded\n[create-webhook] >\n[create-webhook] } [195 bytes data]\n[create-webhook] * upload completely sent off: 195 out of 195 bytes\n[create-webhook] < HTTP/1.1 201 Created\n[create-webhook] < Date: Fri, 27 Dec 2019 10:19:37 GMT\n[create-webhook] < Content-Type: application/json; charset=utf-8\n[create-webhook] < Content-Length: 688\n[create-webhook] < Server: GitHub.com\n[create-webhook] < Status: 201 Created\n[create-webhook] < X-RateLimit-Limit: 5000\n[create-webhook] < X-RateLimit-Remaining: 4992\n[create-webhook] < X-RateLimit-Reset: 1577445296\n[create-webhook] < Cache-Control: private, max-age=60, s-maxage=60\n[create-webhook] < Vary: Accept, Authorization, Cookie, X-GitHub-OTP\n[create-webhook] < ETag: "a9xxxxxxxxxxxxxxxxxxxxxxxxxxxxe3"\n[create-webhook] < X-OAuth-Scopes: admin:org_hook, admin:repo_hook, delete_repo, read:org, repo, user:email\n[create-webhook] < X-Accepted-OAuth-Scopes: admin:repo_hook, public_repo, repo, write:repo_hook\n[create-webhook] < Location: https://api.github.com/repos/ruzickap/podinfo/hooks/170061618\n[create-webhook] < X-GitHub-Media-Type: github.v3; format=json\n[create-webhook] < Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type\n[create-webhook] < Access-Control-Allow-Origin: *\n[create-webhook] < Strict-Transport-Security: max-age=31536000; includeSubdomains; preload\n[create-webhook] < X-Frame-Options: deny\n[create-webhook] < X-Content-Type-Options: nosniff\n[create-webhook] < X-XSS-Protection: 1; mode=block\n[create-webhook] < Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin\n[create-webhook] < Content-Security-Policy: default-src \'none\'\n[create-webhook] < Vary: Accept-Encoding\n[create-webhook] < X-GitHub-Request-Id: CEXX:XXXXX:XXXXXXX:XXXXXXX:XXXXXXB9\n[create-webhook] <\n[create-webhook] { [688 bytes data]\n100 883 100 688 100 195 1746 494 --:--:-- --:--:-- --:--:-- 2241\n[create-webhook] * Connection #0 to host api.github.com left intact\n[create-webhook] {\n[create-webhook] "type": "Repository",\n[create-webhook] "id": 170061618,\n[create-webhook] "name": "web",\n[create-webhook] "active": true,\n[create-webhook] "events": [\n[create-webhook] "pull_request",\n[create-webhook] "push"\n[create-webhook] ],\n[create-webhook] "config": {\n[create-webhook] "content_type": "json",\n[create-webhook] "insecure_ssl": "1",\n[create-webhook] "secret": "********",\n[create-webhook] "url": "https://getting-started.mylabs.dev"\n[create-webhook] },\n[create-webhook] "updated_at": "2019-12-27T10:19:37Z",\n[create-webhook] "created_at": "2019-12-27T10:19:37Z",\n[create-webhook] "url": "https://api.github.com/repos/ruzickap/podinfo/hooks/170061618",\n[create-webhook] "test_url": "https://api.github.com/repos/ruzickap/podinfo/hooks/170061618/test",\n[create-webhook] "ping_url": "https://api.github.com/repos/ruzickap/podinfo/hooks/170061618/pings",\n[create-webhook] "last_response": {\n[create-webhook] "code": null,\n[create-webhook] "status": "unused",\n[create-webhook] "message": null\n[create-webhook] }\n[create-webhook] }\n')])])]),t("p",[e._v("You should also see in the GitHub / Settings / Webhook the registration "),t("a",{attrs:{href:"https://github.com/ruzickap/podinfo/settings/hooks/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/ruzickap/podinfo/settings/hooks/"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("p",[t("img",{attrs:{src:a(307),alt:"GitHub Webhooks",title:"GitHub Webhooks"}})]),e._v(" "),t("p",[e._v("After clicking on the Webhook you can see the details:")]),e._v(" "),t("p",[t("img",{attrs:{src:a(308),alt:"GitHub Webhooks - Details",title:"GitHub Webhooks - Details"}})]),e._v(" "),t("p",[e._v("In case you are troubleshooting the incoming traffic from GitHub the look at\nthe logs of the pod. You should be able to see the details\nin the "),t("code",[e._v("kubectl logs")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("kubectl get pods "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-l")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("eventlistener")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("getting-started-listener\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sleep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v("\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("NAME READY STATUS RESTARTS AGE\nel-getting-started-listener-fcffc467d-xwsfp 1/1 Running 0 2m6s\n")])])]),t("h2",{attrs:{id:"change-the-source-code-of-the-app"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#change-the-source-code-of-the-app"}},[e._v("#")]),e._v(" Change the source code of the app")]),e._v(" "),t("p",[e._v("Trigger the pipeline by calling the:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Trigger build"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),e._v(" podinfo/README.md\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-C")]),e._v(" podinfo commit "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-m")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Standard version"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-C")]),e._v(" podinfo push ruzickap\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sleep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("30")]),e._v("\nkubectl "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--timeout")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("10m "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("wait")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--for")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("condition"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("Succeeded pipelineruns "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--all")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sleep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v("\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("[master d4120e6] Standard version\n 1 file changed, 1 insertion(+), 1 deletion(-)\nWarning: Permanently added '[ssh.github.com]:443,[192.30.253.122]:443' (RSA) to the list of known hosts.\nEnumerating objects: 5, done.\nCounting objects: 100% (5/5), done.\nDelta compression using up to 4 threads\nCompressing objects: 100% (3/3), done.\nWriting objects: 100% (3/3), 325 bytes | 162.00 KiB/s, done.\nTotal 3 (delta 2), reused 0 (delta 0)\nremote: Resolving deltas: 100% (2/2), completed with 2 local objects.\nTo github.com:ruzickap/podinfo.git\n 948de81..d4120e6 master -> master\npipelinerun.tekton.dev/getting-started-pipeline-run-fzrtg condition met\n")])])]),t("p",[e._v("Look at the logs of the newly deployed pod (look at "),t("code",[e._v('"Starting podinfo"')]),e._v("):")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("PODINFO_POD")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("kubectl get pods "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-l")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("run"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("podinfo "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-o")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("jsonpath")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{.items[0].metadata.name}"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\nkubectl "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${PODINFO_POD}")]),e._v("\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"level"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"info"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"ts"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2019-11-27T15:00:58.907Z"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"caller"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"podinfo/main.go:120"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"msg"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Starting podinfo"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"version"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"3.1.5"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"revision"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"164a27b33b09d1b50fad277a60a6c19d353cb9d8"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"port"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"9898"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Let's try to change the code of the application:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sed")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"s/Starting podinfo/Starting podinfo - new Tekton build version/"')]),e._v(" podinfo/cmd/podinfo/main.go\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-C")]),e._v(" podinfo "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("diff")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-C")]),e._v(" podinfo commit "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-m")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"String changed"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-C")]),e._v(" podinfo push ruzickap\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sleep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("20")]),e._v("\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\nmodified: cmd/podinfo/main.go\n─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n@ cmd/podinfo/main.go:120 @ func main() {\n }\n\n // log version and port\n logger.Info("Starting podinfo",\n logger.Info("Starting podinfo - new Tekton build version",\n zap.String("version", viper.GetString("version")),\n zap.String("revision", viper.GetString("revision")),\n zap.String("port", srvCfg.Port),\n[master 4d9f5bc] String changed\n 1 file changed, 1 insertion(+), 1 deletion(-)\nWarning: Permanently added \'[ssh.github.com]:443,[192.30.253.122]:443\' (RSA) to the list of known hosts.\nEnumerating objects: 9, done.\nCounting objects: 100% (9/9), done.\nDelta compression using up to 4 threads\nCompressing objects: 100% (4/4), done.\nWriting objects: 100% (5/5), 459 bytes | 459.00 KiB/s, done.\nTotal 5 (delta 2), reused 0 (delta 0)\nremote: Resolving deltas: 100% (2/2), completed with 2 local objects.\nTo github.com:ruzickap/podinfo.git\n d4120e6..4d9f5bc master -> master\n')])])]),t("p",[e._v("Wait for the pipelines to complete:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("kubectl "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--timeout")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("10m "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("wait")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--for")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("condition"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("Succeeded pipelineruns "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--all")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sleep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v("\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("pipelinerun.tekton.dev/getting-started-pipeline-run-dzqdl condition met\npipelinerun.tekton.dev/getting-started-pipeline-run-fzrtg condition met\n")])])]),t("p",[e._v('Check how the logs of the newly deployed podinfo logs should contain\n"Starting podinfo - new Tekton build version":')]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("PODINFO_POD")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("kubectl get pods "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-l")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("run"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("podinfo "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-o")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("jsonpath")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{.items[0].metadata.name}"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\nkubectl "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started delete pod "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${PODINFO_POD}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sleep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("PODINFO_POD")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),e._v("kubectl get pods "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-l")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("run"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("podinfo "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-o")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("jsonpath")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"{.items[0].metadata.name}"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\nkubectl "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-n")]),e._v(" getting-started "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("${PODINFO_POD}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("\n")])])]),t("p",[e._v("Output:")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[e._v("pod "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"podinfo-6ccfb5f9b6-bwrbn"')]),e._v(" deleted\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"level"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"info"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"ts"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"2019-12-27T10:28:22.304Z"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"caller"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"podinfo/main.go:120"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"msg"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Starting podinfo - new Tekton build version"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"version"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"3.1.5"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"revision"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"4d9f5bc71bd9a8c7ae44a9cd9631e45067727a2e"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"port"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"9898"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/23.1d6373ca.js b/assets/js/23.1d6373ca.js new file mode 100644 index 0000000..972f306 --- /dev/null +++ b/assets/js/23.1d6373ca.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{246:function(t,n,e){"use strict";e.d(n,"d",(function(){return r})),e.d(n,"a",(function(){return s})),e.d(n,"i",(function(){return u})),e.d(n,"f",(function(){return a})),e.d(n,"g",(function(){return l})),e.d(n,"h",(function(){return c})),e.d(n,"b",(function(){return f})),e.d(n,"e",(function(){return h})),e.d(n,"k",(function(){return p})),e.d(n,"l",(function(){return d})),e.d(n,"c",(function(){return b})),e.d(n,"j",(function(){return m}));e(92);const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,u=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function a(t){return u.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function f(t){if(a(t))return t;const n=t.match(r),e=n?n[0]:"",i=o(t);return s.test(i)?t:i+".html"+e}function h(t,n){const e=decodeURIComponent(t.hash),i=function(t){const n=t.match(r);if(n)return n[0]}(n);if(i&&e!==i)return!1;return o(t.path)===o(n)}function p(t,n,e){if(a(n))return{type:"external",path:n};e&&(n=function(t,n,e){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;const i=n.split("/");e&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(n,e,r,i=1){if("string"==typeof n)return p(e,n,r);if(Array.isArray(n))return Object.assign(p(e,n[0],r),{title:n[1]});{const s=n.children||[];return 0===s.length&&n.path?Object.assign(p(e,n.path,r),{title:n.title}):{type:"group",path:n.path,title:n.title,sidebarDepth:n.sidebarDepth,initialOpenGroupIndex:n.initialOpenGroupIndex,children:s.map(n=>t(n,e,r,i+1)),collapsable:!1!==n.collapsable}}}(t,i,e)):[]}return[]}function g(t){const n=b(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:n.map(n=>({type:"auto",title:n.title,basePath:t.path,path:t.path+"#"+n.slug,children:n.children||[]}))}]}function b(t){let n;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?n=t:n&&(n.children||(n.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},248:function(t,n,e){"use strict";e.r(n);var r=e(246),i={name:"NavLink",props:{item:{required:!0}},computed:{link(){return Object(r.b)(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(t=>t===this.link):"/"===this.link},isNonHttpURI(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget(){return"_blank"===this.target},isInternal(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction(){this.$emit("focusout")}}},s=e(8),u=Object(s.a)(i,(function(){var t=this,n=t._self._c;return t.isInternal?n("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(n){return t.focusoutAction.apply(null,arguments)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?n("OutboundLink"):t._e()],1)}),[],!1,null,null,null);n.default=u.exports}}]); \ No newline at end of file diff --git a/assets/js/24.8718cec4.js b/assets/js/24.8718cec4.js new file mode 100644 index 0000000..bdf9a99 --- /dev/null +++ b/assets/js/24.8718cec4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{304:function(a,t,s){a.exports=s.p+"assets/img/kubed.e88b1fb6.svg"},324:function(a,t,s){"use strict";s.r(t);var e=s(8),r=Object(e.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"istio-knative-cert-manager-kubed-installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#istio-knative-cert-manager-kubed-installation"}},[a._v("#")]),a._v(" Istio + Knative + cert-manager + kubed installation")]),a._v(" "),t("p",[a._v("Before we move on with other tasks it is necessary to install Nginx Ingress.\nIt's also handy to install cert-manager for managing SSL certificates.")]),a._v(" "),t("h2",{attrs:{id:"install-cert-manager"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-cert-manager"}},[a._v("#")]),a._v(" Install cert-manager")]),a._v(" "),t("p",[a._v("cert-manager architecture:")]),a._v(" "),t("p",[t("img",{attrs:{src:"https://raw.githubusercontent.com/jetstack/cert-manager/4f30ed75e88e5d0defeb950501b5cac6da7fa7fe/docs/images/high-level-overview.png",alt:"cert-manager high level overview",title:"cert-manager high level overview"}})]),a._v(" "),t("p",[a._v("Install the CRDs resources separately:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" https://raw.githubusercontent.com/jetstack/cert-manager/release-0.10/deploy/manifests/00-crds.yaml\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("sleep")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("5")]),a._v("\n")])])]),t("p",[a._v("Create the namespace for cert-manager and label it to disable resource\nvalidation:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl create namespace cert-manager\nkubectl label namespace cert-manager certmanager.k8s.io/disable-validation"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true\n")])])]),t("p",[a._v("Install the cert-manager Helm chart:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm repo "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("add")]),a._v(" jetstack https://charts.jetstack.io\nhelm repo update\nhelm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" cert-manager "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--namespace")]),a._v(" cert-manager "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),a._v(" jetstack/cert-manager "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--version")]),a._v(" v0.10.1\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v('"jetstack" has been added to your repositories\nHang tight while we grab the latest from your chart repositories...\n...Successfully got an update from the "jetstack" chart repository\n...Successfully got an update from the "stable" chart repository\nUpdate Complete. ⎈ Happy Helming!⎈\nNAME: cert-manager\nLAST DEPLOYED: Fri Dec 27 10:48:40 2019\nNAMESPACE: cert-manager\nSTATUS: deployed\nREVISION: 1\nTEST SUITE: None\nNOTES:\ncert-manager has been deployed successfully!\n\nIn order to begin issuing certificates, you will need to set up a ClusterIssuer\nor Issuer resource (for example, by creating a \'letsencrypt-staging\' issuer).\n\nMore information on the different types of issuers and how to configure them\ncan be found in our documentation:\n\nhttps://docs.cert-manager.io/en/latest/reference/issuers.html\n\nFor information on how to configure cert-manager to automatically provision\nCertificates for Ingress resources, take a look at the `ingress-shim`\ndocumentation:\n\nhttps://docs.cert-manager.io/en/latest/reference/ingress-shim.html\n')])])]),t("h3",{attrs:{id:"create-clusterissuer-for-let-s-encrypt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-clusterissuer-for-let-s-encrypt"}},[a._v("#")]),a._v(" Create ClusterIssuer for Let's Encrypt")]),a._v(" "),t("p",[a._v("Create "),t("code",[a._v("ClusterIssuer")]),a._v(" for Route53 used by cert-manager. It will allow Let's\nEncrypt to generate certificate. Route53 (DNS) method of requesting certificate\nfrom Let's Encrypt must be used to create wildcard certificate "),t("code",[a._v("*.mylabs.dev")]),a._v("\n(details "),t("a",{attrs:{href:"https://community.letsencrypt.org/t/wildcard-certificates-via-http-01/51223",target:"_blank",rel:"noopener noreferrer"}},[a._v("here"),t("OutboundLink")],1),a._v(").")]),a._v(" "),t("p",[t("img",{attrs:{src:"https://b3n.org/wp-content/uploads/2016/09/acme_letsencrypt_dns-01-challenge.png",alt:"ACME DNS Challenge",title:"ACME DNS Challenge"}})]),a._v(" "),t("p",[a._v("("),t("a",{attrs:{href:"https://b3n.org/intranet-ssl-certificates-using-lets-encrypt-dns-01/",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://b3n.org/intranet-ssl-certificates-using-lets-encrypt-dns-01/"),t("OutboundLink")],1),a._v(")")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("USER_AWS_SECRET_ACCESS_KEY_BASE64")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-n")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$USER_AWS_SECRET_ACCESS_KEY")]),a._v('"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" base64"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" -")]),a._v("\napiVersion: v1\nkind: Secret\nmetadata:\n name: aws-user-secret-access-key-secret\n namespace: cert-manager\ndata:\n secret-access-key: "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$USER_AWS_SECRET_ACCESS_KEY_BASE64")]),a._v("\n---\napiVersion: certmanager.k8s.io/v1alpha1\nkind: ClusterIssuer\nmetadata:\n name: letsencrypt-staging-dns\n namespace: cert-manager\nspec:\n acme:\n server: https://acme-staging-v02.api.letsencrypt.org/directory\n email: petr.ruzicka@gmail.com\n privateKeySecretRef:\n name: letsencrypt-staging-dns\n dns01:\n providers:\n - name: aws-route53\n route53:\n accessKeyID: "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${USER_AWS_ACCESS_KEY_ID}")]),a._v("\n region: eu-central-1\n secretAccessKeySecretRef:\n name: aws-user-secret-access-key-secret\n key: secret-access-key\n---\napiVersion: certmanager.k8s.io/v1alpha1\nkind: ClusterIssuer\nmetadata:\n name: letsencrypt-production-dns\n namespace: cert-manager\nspec:\n acme:\n server: https://acme-v02.api.letsencrypt.org/directory\n email: petr.ruzicka@gmail.com\n privateKeySecretRef:\n name: letsencrypt-production-dns\n dns01:\n providers:\n - name: aws-route53\n route53:\n accessKeyID: "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${USER_AWS_ACCESS_KEY_ID}")]),a._v("\n region: eu-central-1\n secretAccessKeySecretRef:\n name: aws-user-secret-access-key-secret\n key: secret-access-key\nEOF")]),a._v("\n")])])]),t("h2",{attrs:{id:"generate-tls-certificate"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generate-tls-certificate"}},[a._v("#")]),a._v(" Generate TLS certificate")]),a._v(" "),t("p",[a._v("Create certificate using cert-manager:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" -")]),a._v("\napiVersion: certmanager.k8s.io/v1alpha1\nkind: Certificate\nmetadata:\n name: ingress-cert-"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v("\n namespace: cert-manager\nspec:\n secretName: ingress-cert-"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v("\n issuerRef:\n kind: ClusterIssuer\n name: letsencrypt-"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v('-dns\n commonName: "*.'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('"\n dnsNames:\n - "*.'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('"\n acme:\n config:\n - dns01:\n provider: aws-route53\n domains:\n - "*.'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('"\nEOF')]),a._v("\n")])])]),t("p",[a._v("("),t("a",{attrs:{href:"https://www.openshift.com/blog/self-serviced-end-to-end-encryption-approaches-for-applications-deployed-in-openshift",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://www.openshift.com/blog/self-serviced-end-to-end-encryption-approaches-for-applications-deployed-in-openshift"),t("OutboundLink")],1),a._v(")")]),a._v(" "),t("h2",{attrs:{id:"install-kubed"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-kubed"}},[a._v("#")]),a._v(" Install kubed")]),a._v(" "),t("p",[a._v("It's necessary to copy the wildcard certificate across all \"future\" namespaces\nand that's the reason why "),t("a",{attrs:{href:"https://github.com/appscode/kubed",target:"_blank",rel:"noopener noreferrer"}},[a._v("kubed"),t("OutboundLink")],1),a._v(" needs to be\ninstalled (for now).\n"),t("a",{attrs:{href:"https://github.com/appscode/kubed",target:"_blank",rel:"noopener noreferrer"}},[a._v("kubed"),t("OutboundLink")],1),a._v(" can "),t("a",{attrs:{href:"https://appscode.com/products/kubed/0.9.0/guides/config-syncer/",target:"_blank",rel:"noopener noreferrer"}},[a._v("synchronize ConfigMaps/Secrets"),t("OutboundLink")],1),a._v("\nacross Kubernetes namespaces/clusters.")]),a._v(" "),t("p",[a._v("Kubed - synchronize secret diagram:")]),a._v(" "),t("p",[t("img",{attrs:{src:s(304),alt:"Kubed - synchronize secret",title:"Kubed - synchronize secret"}})]),a._v(" "),t("p",[a._v("Add kubed helm repository:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm repo "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("add")]),a._v(" appscode https://charts.appscode.com/stable/\nhelm repo update\n")])])]),t("p",[a._v("Install kubed:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" kubed appscode/kubed "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--version")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0.11")]),a._v(".0 "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--namespace")]),a._v(" kube-system "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("apiserver.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("config.clusterName")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("my_k8s_cluster\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v('NAME: kubed\nLAST DEPLOYED: Fri Dec 27 10:49:39 2019\nNAMESPACE: kube-system\nSTATUS: deployed\nREVISION: 1\nTEST SUITE: None\nNOTES:\nTo verify that Kubed has started, run:\n\n kubectl --namespace=kube-system get deployments -l "release=kubed, app=kubed"\n')])])]),t("p",[a._v("Annotate (mark) the cert-manager secret to be copied to other namespaces\nif necessary:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl annotate secret ingress-cert-"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-n")]),a._v(" cert-manager kubed.appscode.com/sync"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"app=kubed"')]),a._v("\n")])])]),t("h2",{attrs:{id:"install-istio"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-istio"}},[a._v("#")]),a._v(" Install Istio")]),a._v(" "),t("p",[a._v("Add Istio helm chart repository:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("ISTIO_VERSION")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"1.3.6"')]),a._v("\nhelm repo "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("add")]),a._v(" istio.io https://storage.googleapis.com/istio-release/releases/"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${ISTIO_VERSION}")]),a._v("/charts/\nhelm repo update\n")])])]),t("p",[a._v("Install CRDs for Istio:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl create namespace istio-system\nhelm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" istio-init istio.io/istio-init "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--namespace")]),a._v(" istio-system "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--version")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${ISTIO_VERSION}")]),a._v("\nkubectl "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-n")]),a._v(" istio-system "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("wait")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--for")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("condition"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("complete job "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--all")]),a._v("\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("namespace/istio-system created\nNAME: istio-init\nLAST DEPLOYED: Fri Dec 27 10:49:56 2019\nNAMESPACE: istio-system\nSTATUS: deployed\nREVISION: 1\nTEST SUITE: None\njob.batch/istio-init-crd-10-1.3.6 condition met\njob.batch/istio-init-crd-11-1.3.6 condition met\njob.batch/istio-init-crd-12-1.3.6 condition met\n")])])]),t("p",[a._v("Label Istio namespace and which will trigger "),t("code",[a._v("kubed")]),a._v(" to copy there the secret\nwith certificates signed by Let's Encrypt:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl label namespace istio-system "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("app")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("kubed\n")])])]),t("p",[a._v("Install Istio:")]),a._v(" "),t("p",[a._v("(steps take from "),t("a",{attrs:{href:"https://github.com/knative/docs/blob/a8a1032de0c2b19f07a70456c030dfde94b12c03/docs/install/installing-istio.md",target:"_blank",rel:"noopener noreferrer"}},[a._v("Knative page"),t("OutboundLink")],1),a._v(")")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("helm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" istio istio.io/istio "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--namespace")]),a._v(" istio-system "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--version")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${ISTIO_VERSION}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.autoscaleMax"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.autoscaleMin"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".name"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("status-port "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".port"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("15020")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".targetPort"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("15020")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".name"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".nodePort"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("31380")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".port"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("80")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".targetPort"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("80")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".name"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("https "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".nodePort"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("31390")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("2")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".port"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("443")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".name"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("ssh "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".nodePort"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("31400")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.ports"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("3")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".port"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("22")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" gateways.istio-ingressgateway.sds.enabled"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("global.disablePolicyChecks")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("global.k8sIngress.enableHttps")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("global.k8sIngress.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("global.proxy.autoInject")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("disabled "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" grafana.datasources."),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"datasources\\.yaml"')]),a._v(".datasources"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".access"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("proxy "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" grafana.datasources."),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"datasources\\.yaml"')]),a._v(".datasources"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".editable"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" grafana.datasources."),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"datasources\\.yaml"')]),a._v(".datasources"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".isDefault"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" grafana.datasources."),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"datasources\\.yaml"')]),a._v(".datasources"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".jsonData.timeInterval"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("5s "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" grafana.datasources."),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"datasources\\.yaml"')]),a._v(".datasources"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".name"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("Prometheus "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" grafana.datasources."),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"datasources\\.yaml"')]),a._v(".datasources"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".orgId"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" grafana.datasources."),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"datasources\\.yaml"')]),a._v(".datasources"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".type"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("prometheus "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" grafana.datasources."),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"datasources\\.yaml"')]),a._v(".datasources"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),a._v(".url"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://prometheus-system-np.knative-monitoring.svc.cluster.local:8080 "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("grafana.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("kiali.contextPath")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/ "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("kiali.createDemoSecret")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("kiali.dashboard.grafanaURL")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://grafana."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/ "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("kiali.dashboard.jaegerURL")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://jaeger."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/ "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("kiali.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("kiali.prometheusAddr")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("http://prometheus-system-np.knative-monitoring.svc.cluster.local:8080 "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("mixer.adapters.prometheus.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("pilot.traceSampling")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("100")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("prometheus.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("false "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("sidecarInjectorWebhook.enableNamespacesByDefault")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("sidecarInjectorWebhook.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("tracing.enabled")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-text extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[a._v("NAME: istio\nLAST DEPLOYED: Fri Dec 27 10:50:54 2019\nNAMESPACE: istio-system\nSTATUS: deployed\nREVISION: 1\nTEST SUITE: None\nNOTES:\nThank you for installing Istio.\n\nYour release is named Istio.\n\nTo get started running application with Istio, execute the following steps:\n1. Label namespace that application object will be deployed to by the following command (take default namespace as an example)\n\n kubectl label namespace default istio-injection=enabled\n kubectl get namespace -L istio-injection\n\n2. Deploy your applications\n\n kubectl apply -f <your-application>.yaml\n\nFor more information on running Istio, visit:\nhttps://istio.io/\n")])])]),t("p",[a._v("Let "),t("code",[a._v("istio-ingressgateway")]),a._v(" to use cert-manager generated certificate via\n"),t("a",{attrs:{href:"https://www.envoyproxy.io/docs/envoy/v1.5.0/intro/arch_overview/service_discovery#arch-overview-service-discovery-types-sds",target:"_blank",rel:"noopener noreferrer"}},[a._v("SDS"),t("OutboundLink")],1),a._v(".\nSteps are taken from this URL: "),t("a",{attrs:{href:"https://istio.io/docs/tasks/traffic-management/ingress/ingress-certmgr/",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://istio.io/docs/tasks/traffic-management/ingress/ingress-certmgr/"),t("OutboundLink")],1),a._v(".")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-n")]),a._v(" istio-system patch gateway istio-autogenerated-k8s-ingress "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--type")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("json "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-p")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"[{"')]),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("op")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),a._v("replace"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('", "')]),a._v("path"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),a._v("/spec/servers/1/tls"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('", "')]),a._v("value"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": {"')]),a._v("credentialName"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),a._v("ingress-cert-"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('", "')]),a._v("mode"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),a._v("SIMPLE"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('", "')]),a._v("privateKey"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),a._v("sds"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('", "')]),a._v("serverCertificate"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),a._v("sds"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"}}]"')]),a._v("\n")])])]),t("p",[a._v("Disable HTTP2 for gateway "),t("code",[a._v("istio-autogenerated-k8s-ingress")]),a._v(" to be compatible\nwith Knative:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-n")]),a._v(" istio-system patch gateway istio-autogenerated-k8s-ingress "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--type")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("json "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-p")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"[{"')]),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("op")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),a._v("replace"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('", "')]),a._v("path"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),a._v("/spec/servers/0/port"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('", "')]),a._v("value"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": {"')]),a._v("name"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),a._v("http"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('", "')]),a._v("number"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("80")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('", "')]),a._v("protocol"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('": "')]),a._v("HTTP"),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"}}]"')]),a._v("\n")])])]),t("p",[a._v("Allow the "),t("code",[a._v("default")]),a._v(" namespace to use Istio injection:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl label namespace default istio-injection"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("enabled\n")])])]),t("p",[a._v("Configure the Istio services "),t("a",{attrs:{href:"https://www.jaegertracing.io/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Jaeger"),t("OutboundLink")],1),a._v(" and\n"),t("a",{attrs:{href:"https://www.kiali.io/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Kiali"),t("OutboundLink")],1),a._v(" to be visible externally:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[a._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" kubectl apply "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" -")]),a._v("\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n name: istio-services-gateway\n namespace: istio-system\nspec:\n selector:\n istio: ingressgateway\n servers:\n - port:\n number: 80\n name: http-istio-services\n protocol: HTTP\n hosts:\n - grafana-istio."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n - jaeger-istio."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n - kiali-istio."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n - port:\n number: 443\n name: https-istio-services\n protocol: HTTPS\n hosts:\n - grafana-istio."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n - jaeger-istio."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n - kiali-istio."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n tls:\n credentialName: ingress-cert-"),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v("\n mode: SIMPLE\n privateKey: sds\n serverCertificate: sds\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: grafana-istio-virtual-service\n namespace: istio-system\nspec:\n hosts:\n - grafana-istio."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n gateways:\n - istio-services-gateway\n http:\n - route:\n - destination:\n host: grafana.istio-system.svc.cluster.local\n port:\n number: 3000\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: jaeger-istio-virtual-service\n namespace: istio-system\nspec:\n hosts:\n - jaeger-istio."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n gateways:\n - istio-services-gateway\n http:\n - route:\n - destination:\n host: tracing.istio-system.svc.cluster.local\n port:\n number: 80\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: kiali-istio-virtual-service\n namespace: istio-system\nspec:\n hosts:\n - kiali-istio."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n gateways:\n - istio-services-gateway\n http:\n - route:\n - destination:\n host: kiali.istio-system.svc.cluster.local\n port:\n number: 20001\nEOF")]),a._v("\n")])])]),t("h2",{attrs:{id:"create-dns-records"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-dns-records"}},[a._v("#")]),a._v(" Create DNS records")]),a._v(" "),t("p",[a._v("Install "),t("a",{attrs:{href:"https://github.com/kubernetes-incubator/external-dns",target:"_blank",rel:"noopener noreferrer"}},[a._v("external-dns"),t("OutboundLink")],1),a._v(" and\nlet it manage "),t("code",[a._v("mylabs.dev")]),a._v(" entries in Route 53 (Do not upgrade external-dns,\nbecause it's not backward compatible and using different way of authentication\nto Route53 using roles):")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[a._v("kubectl create namespace external-dns\nhelm "),t("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" external-dns stable/external-dns "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--namespace")]),a._v(" external-dns "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--version")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("2.10")]),a._v(".1 "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--wait")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("aws.credentials.accessKey")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${USER_AWS_ACCESS_KEY_ID}")]),a._v('"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("aws.credentials.secretKey")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${USER_AWS_SECRET_ACCESS_KEY}")]),a._v('"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("aws.region")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("eu-central-1 "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("domainFilters")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("istioIngressGateways")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("istio-system/istio-ingressgateway"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("interval")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"10s"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("policy")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"sync"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("rbac.create")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("true "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("sources")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{istio-gateway,service}"')]),a._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--set")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("txtOwnerId")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),t("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s."),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('"')]),a._v("\n")])])]),t("p",[a._v("Output:")]),a._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[a._v("namespace/external-dns created\nNAME"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" external-dns\nLAST DEPLOYED"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" Fri Dec "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("27")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("10")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("53")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("29")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("2019")]),a._v("\nNAMESPACE"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" external-dns\nSTATUS"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" deployed\nREVISION"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v("\nTEST SUITE"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" None\nNOTES"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v("\n** Please be patient while the chart is being deployed **\n\nTo verify that external-dns has started"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v(" run"),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v("\n\n kubectl --namespace=external-dns get pods -l "),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"app.kubernetes.io/name=external-dns,app.kubernetes.io/instance=external-dns"')]),a._v("\n")])])]),t("p",[t("img",{attrs:{src:"https://raw.githubusercontent.com/aws-samples/eks-workshop/65b766c494a5b4f5420b2912d8373c4957163541/static/images/crystal.svg?sanitize=true",alt:"Architecture",title:"Architecture"}})]),a._v(" "),t("p",[a._v("You should be able to reach these URLs:")]),a._v(" "),t("ul",[t("li",[a._v("Grafana: "),t("a",{attrs:{href:"https://grafana-istio.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://grafana-istio.mylabs.dev"),t("OutboundLink")],1)]),a._v(" "),t("li",[a._v("Jaeger: "),t("a",{attrs:{href:"https://jaeger-istio.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://jaeger-istio.mylabs.dev"),t("OutboundLink")],1)]),a._v(" "),t("li",[a._v("Kiali: "),t("a",{attrs:{href:"https://kiali-istio.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://kiali-istio.mylabs.dev"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/25.b07eebdf.js b/assets/js/25.b07eebdf.js new file mode 100644 index 0000000..75a55c5 --- /dev/null +++ b/assets/js/25.b07eebdf.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{303:function(t,a,s){t.exports=s.p+"assets/img/GitLab.dd7e0dbb.png"},323:function(t,a,s){"use strict";s.r(a);var e=s(8),n=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"install-gitlab"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-gitlab"}},[t._v("#")]),t._v(" Install GitLab")]),t._v(" "),a("p",[t._v("Add GitLab repository:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("helm repo "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" gitlab https://charts.gitlab.io/\nhelm repo update\n")])])]),a("p",[t._v("Create "),a("code",[t._v("gitlab")]),t._v(" namespaces with secrets needed for GitLab\n(certificates and passwords):")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl create namespace gitlab\nkubectl create secret generic gitlab-initial-root-password --from-literal"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("password"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"admin123"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" gitlab\nkubectl create secret generic custom-ca --from-file"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("unique_name"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("tmp/fakelerootx1.pem "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" gitlab\n")])])]),a("p",[t._v('Create Istio Gateways and VirtualServices to allow accessing GitLab from\n"outside":')]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("EOF"),a("span",{pre:!0,attrs:{class:"token bash punctuation"}},[t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v(" -")]),t._v("\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n name: gitlab-gateway\n namespace: gitlab\nspec:\n selector:\n istio: ingressgateway\n servers:\n - port:\n number: 22\n name: ssh-gitlab\n protocol: TCP\n hosts:\n - gitlab."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n - port:\n number: 80\n name: http-gitlab\n protocol: HTTP\n hosts:\n - gitlab."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n - minio."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n tls:\n httpsRedirect: true\n - port:\n number: 443\n name: https-gitlab\n protocol: HTTPS\n hosts:\n - gitlab."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n - minio."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n tls:\n credentialName: ingress-cert-"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${LETSENCRYPT_ENVIRONMENT}")]),t._v("\n mode: SIMPLE\n privateKey: sds\n serverCertificate: sds\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: gitlab-ssh-virtual-service\n namespace: gitlab\nspec:\n hosts:\n - gitlab."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n gateways:\n - gitlab-gateway\n tcp:\n - match:\n - port: 22\n route:\n - destination:\n host: gitlab-gitlab-shell.gitlab.svc.cluster.local\n port:\n number: 22\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: gitlab-http-virtual-service\n namespace: gitlab\nspec:\n hosts:\n - gitlab."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n gateways:\n - gitlab-gateway\n http:\n - match:\n - uri:\n prefix: /admin/sidekiq\n route:\n - destination:\n host: gitlab-unicorn.gitlab.svc.cluster.local\n port:\n number: 8080\n - route:\n - destination:\n host: gitlab-unicorn.gitlab.svc.cluster.local\n port:\n number: 8181\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: gitlab-minio-virtual-service\n namespace: gitlab\nspec:\n hosts:\n - minio."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n gateways:\n - gitlab-gateway\n http:\n - route:\n - destination:\n host: gitlab-minio-svc.gitlab.svc.cluster.local\n port:\n number: 9000\nEOF")]),t._v("\n")])])]),a("p",[t._v("Install GitLab using Helm:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("helm "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" gitlab gitlab/gitlab "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--namespace")]),t._v(" gitlab "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--wait")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.6")]),t._v(".0 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("certmanager.install")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("false "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" gitlab-runner.install"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("false "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("gitlab.gitaly.persistence.size")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("1Gi "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("gitlab.unicorn.ingress.enabled")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("false "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.appConfig.cron_jobs.ci_archive_traces_cron_worker.cron")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"17 * * * *"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.appConfig.cron_jobs.expire_build_artifacts_worker.cron")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"50 * * * *"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.appConfig.cron_jobs.pipeline_schedule_worker.cron")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"19 * * * *"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.appConfig.cron_jobs.repository_archive_cache_worker.cron")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0 * * * *"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.appConfig.cron_jobs.repository_check_worker.cron")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"20 * * * *"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.appConfig.cron_jobs.stuck_ci_jobs_worker.cron")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0 * * * *"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.appConfig.gravatar.plainUrl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://www.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.appConfig.gravatar.sslUrl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" global.certificates.customCAs"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(".secret"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("custom-ca "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.edition")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("ce "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.hosts.domain")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.ingress.configureCertmanager")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("false "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.ingress.enabled")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("false "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("global.initialRootPassword.secret")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("gitlab-initial-root-password "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("minio.persistence.size")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("5Gi "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" nginx-ingress.enabled"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("false "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgresql.persistence.size")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("1Gi "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("prometheus.install")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("false "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("redis.persistence.size")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("1Gi "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("registry.enabled")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("false\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("NAME: gitlab\nLAST DEPLOYED: Fri Dec 27 10:57:01 2019\nNAMESPACE: gitlab\nSTATUS: deployed\nREVISION: 1\nNOTES:\nWARNING: Automatic TLS certificate generation with cert-manager is disabled and no TLS certificates were provided. Self-signed certificates were generated.\n\nYou may retrieve the CA root for these certificates from the `gitlab-wildcard-tls-ca` secret, via the following command. It can then be imported to a web browser or system store.\n\n kubectl get secret gitlab-wildcard-tls-ca -ojsonpath='{.data.cfssl_ca}' | base64 --decode > gitlab.mylabs.dev.ca.pem\n\nIf you do not wish to use self-signed certificates, please set the following properties:\n - global.ingress.tls.secretName\n OR\n - gitlab.unicorn.ingress.tls.secretName\n - minio.ingress.tls.secretName\n")])])]),a("p",[t._v("Try to access the GitLab using the URL "),a("a",{attrs:{href:"https://gitlab.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://gitlab.mylabs.dev"),a("OutboundLink")],1),t._v("\nwith following credentials:")]),t._v(" "),a("ul",[a("li",[t._v("Username: "),a("code",[t._v("root")])]),t._v(" "),a("li",[t._v("Password: "),a("code",[t._v("admin123")])])]),t._v(" "),a("p",[t._v("Create Personal Access Token "),a("code",[t._v("1234567890")]),t._v(" for user "),a("code",[t._v("root")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("UNICORN_POD")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("kubectl get pods "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" gitlab "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-l")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("app"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("unicorn "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("jsonpath")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{.items[0].metadata.name}"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${UNICORN_POD}")]),t._v("\nkubectl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exec")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" gitlab "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-it")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$UNICORN_POD")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" unicorn -- /bin/bash "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"\ncd /srv/gitlab;\nbin/rails r '),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("\ntoken_digest = Gitlab::CryptoHelper.sha256 "),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[t._v("\\\\")]),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("1234567890"),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[t._v("\\\\")]),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(";\ntoken=PersonalAccessToken.create!(name: "),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[t._v("\\\\")]),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("Full Access"),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[t._v("\\\\")]),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(", scopes: [:api], user: User.where(id: 1).first, token_digest: token_digest);\ntoken.save!\n"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(';\n"')]),t._v("\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("gitlab-unicorn-566c465dc4-4dwdz\n")])])]),a("p",[t._v("Create new user "),a("code",[t._v("myuser")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GITLAB_USER_ID")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-k")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-X")]),t._v(" POST "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-H")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Content-type: application/json"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-H")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PRIVATE-TOKEN: 1234567890"')]),t._v(" https://gitlab.$"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("MY_DOMAIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("/api/v4/users "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{\n '),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("name"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("myuser"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("username"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("myuser"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("password"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("myuser_password"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("email"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("myuser@"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("skip_confirmation"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(': true\n}"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" jq "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('".id"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${GITLAB_USER_ID}")]),t._v("\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("2\n")])])]),a("p",[t._v("Create a personal access token for user "),a("code",[t._v("myuser")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exec")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" gitlab "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-it")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$UNICORN_POD")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" unicorn -- /bin/bash "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"\ncd /srv/gitlab;\nbin/rails r '),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("\ntoken_digest = Gitlab::CryptoHelper.sha256 "),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[t._v("\\\\")]),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("0987654321"),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[t._v("\\\\")]),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(";\ntoken=PersonalAccessToken.create!(name: "),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[t._v("\\\\")]),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("Full Access"),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[t._v("\\\\")]),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(", scopes: [:api], user: User.where(id: "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${GITLAB_USER_ID}")]),t._v(").first, token_digest: token_digest);\ntoken.save!\n"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(';\n"')]),t._v("\n")])])]),a("p",[t._v("Create Impersonation token for "),a("code",[t._v("myuser")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GILAB_MYUSER_TOKEN")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-k")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-X")]),t._v(" POST "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-H")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Content-type: application/json"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-H")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PRIVATE-TOKEN: 1234567890"')]),t._v(" https://gitlab.$"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("MY_DOMAIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("/api/v4/users/$"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("GITLAB_USER_ID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("/impersonation_tokens "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{\n '),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("name"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("mytoken"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("scopes"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": ["),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("api"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(']\n}"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" jq "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-r")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('".token"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${GILAB_MYUSER_TOKEN}")]),t._v("\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("t_dJwRNpVkdsxWzs3Yv3\n")])])]),a("p",[t._v("Create SSH key which will be imported to GitLab:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("ssh-keygen "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-t")]),t._v(" ed25519 "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v(" tmp/id_rsa_gitlab "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-q")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-N")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-C")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my_ssh_key@mylabs.dev"')]),t._v("\n")])])]),a("p",[t._v("Add ssh key to the "),a("code",[t._v("myuser")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-sk")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-X")]),t._v(" POST "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-F")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"private_token='),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${GILAB_MYUSER_TOKEN}")]),t._v('"')]),t._v(" https://gitlab."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("/api/v4/user/keys "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-F")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"title=my_ssh_key"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-F")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"key='),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" tmp/id_rsa_gitlab.pub"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" jq\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-json extra-class"},[a("pre",{pre:!0,attrs:{class:"language-json"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"title"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my_ssh_key"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"key"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKH2+gqsWrziaAmzGumc/frT0EBMSrXSP0MT/jRcKwtm my_ssh_key@mylabs.dev"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token property"}},[t._v('"created_at"')]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2019-12-27T10:01:45.403Z"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Create new project:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("PROJECT_ID")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-k")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-X")]),t._v(" POST "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-H")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Content-type: application/json"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-H")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PRIVATE-TOKEN: 1234567890"')]),t._v(" https://gitlab.$"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("MY_DOMAIN"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("/api/v4/projects/user/$"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("GITLAB_USER_ID"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"{\n '),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("user_id"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${GITLAB_USER_ID}")]),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("name"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("my-podinfo"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("description"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("My Test Project"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("wiki_access_level"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("disabled"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("issues_access_level"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("disabled"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("builds_access_level"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("disabled"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("snippets_access_level"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("disabled"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("container-registry-enabled"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": false,\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("visibility"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("public"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v('\n}"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" jq "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-r")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('".id"')]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${PROJECT_ID}")]),t._v("\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("1\n")])])]),a("p",[t._v("Clone the "),a("a",{attrs:{href:"https://github.com/stefanprodan/podinfo",target:"_blank",rel:"noopener noreferrer"}},[t._v("podinfo"),a("OutboundLink")],1),t._v(" project and push\nit to the newly created git repository "),a("code",[t._v("my-podinfo")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GIT_SSH_COMMAND")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ssh -i '),a("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PWD")]),t._v('/tmp/id_rsa_gitlab -o UserKnownHostsFile=/dev/null"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bare")]),t._v(" https://github.com/stefanprodan/podinfo tmp/podinfo\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-C")]),t._v(" tmp/podinfo push "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--mirror")]),t._v(" git@gitlab."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v(":myuser/my-podinfo.git\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-rf")]),t._v(" tmp/podinfo\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("loning into bare repository 'tmp/podinfo'...\nremote: Enumerating objects: 10, done.\nremote: Counting objects: 100% (10/10), done.\nremote: Compressing objects: 100% (10/10), done.\nremote: Total 5266 (delta 0), reused 3 (delta 0), pack-reused 5256\nReceiving objects: 100% (5266/5266), 9.52 MiB | 1.28 MiB/s, done.\nResolving deltas: 100% (2342/2342), done.\nWarning: Permanently added 'gitlab.mylabs.dev,18.184.227.16' (ECDSA) to the list of known hosts.\nEnumerating objects: 5266, done.\nCounting objects: 100% (5266/5266), done.\nDelta compression using up to 4 threads\nCompressing objects: 100% (2544/2544), done.\nWriting objects: 100% (5266/5266), 9.52 MiB | 6.95 MiB/s, done.\nTotal 5266 (delta 2342), reused 5266 (delta 2342)\nremote: Resolving deltas: 100% (2342/2342), done.\nremote:\nremote: To create a merge request for gh-pages, visit:\nremote: https://gitlab.mylabs.dev/myuser/my-podinfo/merge_requests/new?merge_request%5Bsource_branch%5D=gh-pages\nremote:\nremote: To create a merge request for v0.x, visit:\nremote: https://gitlab.mylabs.dev/myuser/my-podinfo/merge_requests/new?merge_request%5Bsource_branch%5D=v0.x\nremote:\nremote: To create a merge request for v1.x, visit:\nremote: https://gitlab.mylabs.dev/myuser/my-podinfo/merge_requests/new?merge_request%5Bsource_branch%5D=v1.x\nremote:\nremote: To create a merge request for v3.x, visit:\nremote: https://gitlab.mylabs.dev/myuser/my-podinfo/merge_requests/new?merge_request%5Bsource_branch%5D=v3.x\nremote:\nTo gitlab.mylabs.dev:myuser/my-podinfo.git\n * [new branch] gh-pages -> gh-pages\n * [new branch] master -> master\n * [new branch] v0.x -> v0.x\n * [new branch] v1.x -> v1.x\n * [new branch] v3.x -> v3.x\n * [new tag] 0.2.2 -> 0.2.2\n * [new tag] 2.0.0 -> 2.0.0\n * [new tag] 2.0.1 -> 2.0.1\n * [new tag] 2.0.2 -> 2.0.2\n * [new tag] 2.1.0 -> 2.1.0\n * [new tag] 2.1.1 -> 2.1.1\n * [new tag] 2.1.2 -> 2.1.2\n * [new tag] 2.1.3 -> 2.1.3\n * [new tag] 3.0.0 -> 3.0.0\n * [new tag] 3.1.0 -> 3.1.0\n * [new tag] 3.1.1 -> 3.1.1\n * [new tag] 3.1.2 -> 3.1.2\n * [new tag] 3.1.3 -> 3.1.3\n * [new tag] 3.1.4 -> 3.1.4\n * [new tag] 3.1.5 -> 3.1.5\n * [new tag] flux-floral-pine-16 -> flux-floral-pine-16\n * [new tag] flux-thawing-star-34 -> flux-thawing-star-34\n * [new tag] v0.4.0 -> v0.4.0\n * [new tag] v0.5.0 -> v0.5.0\n * [new tag] v1.0.0 -> v1.0.0\n * [new tag] v1.1.0 -> v1.1.0\n * [new tag] v1.1.1 -> v1.1.1\n * [new tag] v1.2.0 -> v1.2.0\n * [new tag] v1.2.1 -> v1.2.1\n * [new tag] v1.3.0 -> v1.3.0\n * [new tag] v1.3.1 -> v1.3.1\n * [new tag] v1.4.0 -> v1.4.0\n * [new tag] v1.4.1 -> v1.4.1\n * [new tag] v1.4.2 -> v1.4.2\n * [new tag] v1.6.0 -> v1.6.0\n * [new tag] v1.7.0 -> v1.7.0\n * [new tag] v1.8.0 -> v1.8.0\n")])])]),a("p",[t._v("GitLab Screenshot:")]),t._v(" "),a("p",[a("img",{attrs:{src:s(303),alt:"GitLab",title:"GitLab"}})])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/26.bb65b742.js b/assets/js/26.bb65b742.js new file mode 100644 index 0000000..0ad632a --- /dev/null +++ b/assets/js/26.bb65b742.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{305:function(t,a,e){t.exports=e.p+"assets/img/Tekton_Dashboard.258cb264.png"},325:function(t,a,e){"use strict";e.r(a);var s=e(8),n=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"install-knative"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-knative"}},[t._v("#")]),t._v(" Install Knative")]),t._v(" "),a("p",[t._v("Set Knative version variable:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("KNATIVE_VERSION")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v0.11.0"')]),t._v("\n")])])]),a("p",[t._v("Install Knative:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--selector")]),t._v(" knative.dev/crd-install"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--filename")]),t._v(" https://github.com/knative/serving/releases/download/"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${KNATIVE_VERSION}")]),t._v("/serving.yaml "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--filename")]),t._v(" https://github.com/knative/eventing/releases/download/"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${KNATIVE_VERSION}")]),t._v("/release.yaml "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--filename")]),t._v(" https://github.com/knative/serving/releases/download/"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${KNATIVE_VERSION}")]),t._v("/monitoring.yaml\nkubectl apply "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--filename")]),t._v(" https://github.com/knative/serving/releases/download/"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${KNATIVE_VERSION}")]),t._v("/serving.yaml "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--filename")]),t._v(" https://github.com/knative/eventing/releases/download/"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${KNATIVE_VERSION}")]),t._v("/release.yaml "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--filename")]),t._v(" https://github.com/knative/serving/releases/download/"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${KNATIVE_VERSION}")]),t._v("/monitoring.yaml\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sleep")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),t._v("\n")])])]),a("p",[t._v("Install Tekton with Dashboard (do not increase Tekton version above 0.8.0):")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--filename")]),t._v(" https://github.com/tektoncd/pipeline/releases/download/v0.8.0/release.yaml\nkubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--filename")]),t._v(" https://github.com/tektoncd/dashboard/releases/download/v0.3.0/dashboard-latest-release.yaml\n")])])]),a("p",[t._v("Install Tekton Triggers:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--filename")]),t._v(" https://github.com/tektoncd/triggers/releases/download/v0.1.0/release.yaml\n")])])]),a("p",[t._v("Export Knative services ("),a("a",{attrs:{href:"https://prometheus.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Prometheus"),a("OutboundLink")],1),t._v(" and\n"),a("a",{attrs:{href:"https://grafana.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Grafana"),a("OutboundLink")],1),t._v(") to be visible externally:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("EOF"),a("span",{pre:!0,attrs:{class:"token bash punctuation"}},[t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v(" -")]),t._v("\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n name: knative-services-gateway\n namespace: knative-monitoring\nspec:\n selector:\n istio: ingressgateway\n servers:\n - port:\n number: 80\n name: http-knative-services\n protocol: HTTP\n hosts:\n - knative-grafana."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n - knative-prometheus."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n - knative-tekton."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n - port:\n number: 443\n name: https-knative-services\n protocol: HTTPS\n hosts:\n - knative-grafana."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n - knative-prometheus."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n - knative-tekton."),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v("\n tls:\n credentialName: ingress-cert-"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${LETSENCRYPT_ENVIRONMENT}")]),t._v('\n mode: SIMPLE\n privateKey: sds\n serverCertificate: sds\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: grafana-virtual-service\n namespace: knative-monitoring\nspec:\n hosts:\n - "knative-grafana.'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v('"\n gateways:\n - knative-services-gateway\n http:\n - route:\n - destination:\n host: grafana.knative-monitoring.svc.cluster.local\n port:\n number: 30802\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: prometheus-virtual-service\n namespace: knative-monitoring\nspec:\n hosts:\n - "knative-prometheus.'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v('"\n gateways:\n - knative-services-gateway\n http:\n - route:\n - destination:\n host: prometheus-system-np.knative-monitoring.svc.cluster.local\n port:\n number: 8080\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n name: tekton-virtual-service\n namespace: knative-monitoring\nspec:\n hosts:\n - "knative-tekton.'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v('"\n gateways:\n - knative-services-gateway\n http:\n - route:\n - destination:\n host: tekton-dashboard.tekton-pipelines.svc.cluster.local\n port:\n number: 9097\nEOF')]),t._v("\n")])])]),a("p",[t._v("Tekton Dashboard:")]),t._v(" "),a("p",[a("img",{attrs:{src:e(305),alt:"Tekton Dashboard",title:"Tekton Dashboard"}})]),t._v(" "),a("p",[t._v("Set up a custom domain for Knative:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("EOF"),a("span",{pre:!0,attrs:{class:"token bash punctuation"}},[t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v(" -")]),t._v("\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: config-domain\n namespace: knative-serving\ndata:\n "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${MY_DOMAIN}")]),t._v(': ""\nEOF')]),t._v("\n")])])]),a("p",[t._v("Changing the controller deployment is needed if you are not using the valid\ncertificates (self-signed):")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${LETSENCRYPT_ENVIRONMENT}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"staging"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n kubectl "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--namespace")]),t._v(" knative-serving create secret generic customca --from-file"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("customca.crt"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("tmp/fakelerootx1.pem\n kubectl patch deployment controller "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--namespace")]),t._v(" knative-serving "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--patch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"\n {\n '),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("spec"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": {\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("template"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": {\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("spec"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": {\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("containers"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": [{\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("env"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": [{\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("name"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("SSL_CERT_DIR"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("value"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("/etc/customca"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("\n }],\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("name"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("controller"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("volumeMounts"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": [{\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("mountPath"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("/etc/customca"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("name"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("customca"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("\n }]\n }],\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("volumes"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": [{\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("name"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("customca"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(",\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("secret"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": {\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("defaultMode"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": 420,\n "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("secretName"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v(": "),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v("customca"),a("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[t._v('\\"')]),t._v('\n }\n }]\n }\n }\n }\n }"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])])]),a("h2",{attrs:{id:"enable-automatic-tls-certificate-provisioning-for-knative"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enable-automatic-tls-certificate-provisioning-for-knative"}},[t._v("#")]),t._v(" Enable automatic TLS certificate provisioning for Knative")]),t._v(" "),a("p",[t._v("Install "),a("code",[t._v("networking-certmanager")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--filename")]),t._v(" https://github.com/knative/serving/releases/download/"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${KNATIVE_VERSION}")]),t._v("/serving-cert-manager.yaml\n")])])]),a("p",[t._v("Update your "),a("code",[t._v("config-certmanager")]),t._v(" ConfigMap in the "),a("code",[t._v("knative-serving")]),t._v(" namespace to\ndefine your new ClusterIssuer configuration and your your DNS provider:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("EOF"),a("span",{pre:!0,attrs:{class:"token bash punctuation"}},[t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v(" -")]),t._v("\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: config-certmanager\n namespace: knative-serving\n labels:\n networking.knative.dev/certificate-provider: cert-manager\ndata:\n issuerRef: |\n kind: ClusterIssuer\n name: letsencrypt-"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${LETSENCRYPT_ENVIRONMENT}")]),t._v("-dns\n solverConfig: |\n dns01:\n provider: aws-route53\nEOF")]),t._v("\n")])])]),a("p",[t._v("Update the "),a("code",[t._v("config-network")]),t._v(" ConfigMap in the "),a("code",[t._v("knative-serving")]),t._v(" namespace to enable\n"),a("code",[t._v("autoTLS")]),t._v(":")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("EOF"),a("span",{pre:!0,attrs:{class:"token bash punctuation"}},[t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" kubectl apply "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v(" -")]),t._v("\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: config-network\n namespace: knative-serving\ndata:\n autoTLS: Enabled\n httpProtocol: Enabled\nEOF")]),t._v("\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/27.5b8b0597.js b/assets/js/27.5b8b0597.js new file mode 100644 index 0000000..ffed790 --- /dev/null +++ b/assets/js/27.5b8b0597.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{306:function(a,e,s){a.exports=s.p+"assets/img/podinfo.d8c508a4.png"},326:function(a,e,s){"use strict";s.r(e);var t=s(8),n=Object(t.a)({},(function(){var a=this,e=a._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"build-and-run-container-image-using-knative-tekton"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#build-and-run-container-image-using-knative-tekton"}},[a._v("#")]),a._v(" Build and run container image using Knative + Tekton")]),a._v(" "),e("p",[a._v("Set the necessary variables:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("GIT_REPOSITORY")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"git@gitlab.'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(':myuser/my-podinfo.git"')]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("GIT_REVISION")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"3.1.0"')]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("GIT_REPO_SSH_KEY")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"tmp/id_rsa_gitlab"')]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("CONTAINER_REGISTRY")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"harbor.'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('/library/my-podinfo"')]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("CONTAINER_REGISTRY_USERNAME")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"robot\\'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$myrobot")]),a._v('"')]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("CONTAINER_REGISTRY_PASSWORD")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${HARBOR_ROBOT_TOKEN}")]),a._v('"')]),a._v("\n\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("GIT_PROJECT_NAME")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" $"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("GIT_REPOSITORY"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("sed")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"s@.*/\\(.*\\).git@'),e("span",{pre:!0,attrs:{class:"token entity",title:"\\1"}},[a._v("\\1")]),a._v('@; s/\\./\\-/"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("CONTAINER_REGISTRY_SERVER")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" $CONTAINER_REGISTRY "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("awk")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-F")]),a._v(" / "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{ print \\'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$1")]),a._v(' }"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("CONTAINER_REGISTRY_SERVER_MODIFIED")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" $CONTAINER_REGISTRY "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("awk")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-F")]),a._v(" / "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{ gsub(/\\./,'),e("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("-"),e("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("); print \\"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$1")]),a._v(' }"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("GIT_SSH_SERVER")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" $GIT_REPOSITORY "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("awk")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-F")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"[@:]"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{ print \\'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$2")]),a._v('}"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("GIT_SSH_SERVER_MODIFIED")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" $GIT_REPOSITORY "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("awk")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-F")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"[@:]"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{ gsub(/\\./,'),e("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("-"),e("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("); print \\"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$2")]),a._v(' }"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n")])])]),e("p",[a._v("Create secret for Harbor registry to let Tekton pipeline to upload the container\nimage:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("kubectl create secret docker-registry "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${CONTAINER_REGISTRY_SERVER_MODIFIED}")]),a._v("-docker-config "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --docker-server"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${CONTAINER_REGISTRY_SERVER}")]),a._v('"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --docker-username"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${CONTAINER_REGISTRY_USERNAME}")]),a._v('"')]),a._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --docker-password"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${CONTAINER_REGISTRY_PASSWORD}")]),a._v('"')]),a._v("\n")])])]),e("p",[a._v("Create secret for AWS user to allow Tekton pipeline to push binary to S3:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("kubectl create secret generic user-aws-access-keys --from-literal"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("access_key"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$USER_AWS_ACCESS_KEY_ID")]),a._v(" --from-literal"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("secret_key"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$USER_AWS_SECRET_ACCESS_KEY")]),a._v("\n")])])]),e("p",[a._v("Create + start Tekton pipeline (and it's components) to build the container\nimage:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v("EOF"),e("span",{pre:!0,attrs:{class:"token bash punctuation"}},[a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" kubectl apply "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" -")]),a._v("\napiVersion: v1\nkind: Secret\ntype: kubernetes.io/ssh-auth\nmetadata:\n name: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_SSH_SERVER_MODIFIED}")]),a._v("-ssh-key\n annotations:\n tekton.dev/git-0: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_SSH_SERVER}")]),a._v("\ndata:\n ssh-privatekey: "),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("base64 "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-w")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),a._v(" $"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("GIT_REPO_SSH_KEY"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_SSH_SERVER_MODIFIED}")]),a._v("-build-bot\nsecrets:\n - name: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_SSH_SERVER_MODIFIED}")]),a._v("-ssh-key\n---\napiVersion: tekton.dev/v1alpha1\nkind: PipelineResource\nmetadata:\n name: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_PROJECT_NAME}")]),a._v("-project-git\n namespace: default\nspec:\n type: git\n params:\n - name: url\n value: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_REPOSITORY}")]),a._v("\n - name: revision\n value: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_REVISION}")]),a._v("\n---\napiVersion: tekton.dev/v1alpha1\nkind: PipelineResource\nmetadata:\n name: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_PROJECT_NAME}")]),a._v("-project-image\nspec:\n type: image\n params:\n - name: url\n value: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${CONTAINER_REGISTRY}")]),a._v(":"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_REVISION}")]),a._v("\n---\napiVersion: tekton.dev/v1alpha1\nkind: Task\nmetadata:\n name: build-docker-image-from-git-task\nspec:\n inputs:\n resources:\n - name: docker-source\n type: git\n params:\n - name: pathToDockerFile\n description: The path to the dockerfile to build\n default: /workspace/docker-source/Dockerfile\n - name: pathToContext\n description:\n The build context used by Kaniko\n (https://github.com/GoogleContainerTools/kaniko#kaniko-build-contexts)\n default: /workspace/docker-source\n outputs:\n resources:\n - name: builtImage\n type: image\n volumes:\n - name: docker-config\n secret:\n secretName: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${CONTAINER_REGISTRY_SERVER_MODIFIED}")]),a._v("-docker-config\n items:\n - key: .dockerconfigjson\n path: config.json\n - name: shared-storage\n emptyDir: {}\n steps:\n - name: build-and-tar\n image: gcr.io/kaniko-project/executor\n command:\n - /kaniko/executor\n args:\n - --dockerfile=\\"),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("inputs.params.pathToDockerFile"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n - --destination=\\"),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("outputs.resources.builtImage.url"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n - --context=\\"),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("inputs.params.pathToContext"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n - --single-snapshot\n - --tarPath=/shared-storage/"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v('-app-build.tar\n - --no-push\n volumeMounts:\n - name: docker-config\n mountPath: /builder/home/.docker/\n - name: shared-storage\n mountPath: /shared-storage\n - name: upload-container-content-s3\n image: atlassian/pipelines-awscli\n command: ["sh", "-x", "-c", "ls -la /shared-storage/ ; aws s3 cp /shared-storage/'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-app-build.tar s3://"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),e("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v('-kops-k8s/"]\n env:\n - name: AWS_DEFAULT_REGION\n value: "eu-central-1"\n - name: AWS_ACCESS_KEY_ID\n valueFrom:\n secretKeyRef:\n name: user-aws-access-keys\n key: access_key\n - name: AWS_SECRET_ACCESS_KEY\n valueFrom:\n secretKeyRef:\n name: user-aws-access-keys\n key: secret_key\n volumeMounts:\n - name: shared-storage\n mountPath: /shared-storage\n - name: build-and-push\n image: gcr.io/kaniko-project/executor\n env:\n - name: "DOCKER_CONFIG"\n value: "/builder/home/.docker/"\n command:\n - /kaniko/executor\n args:\n - --dockerfile=\\'),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("inputs.params.pathToDockerFile"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n - --destination=\\"),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("outputs.resources.builtImage.url"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n - --context=\\"),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("inputs.params.pathToContext"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n - --single-snapshot\n - --skip-tls-verify\n volumeMounts:\n - name: docker-config\n mountPath: /builder/home/.docker/\n---\napiVersion: tekton.dev/v1alpha1\nkind: Pipeline\nmetadata:\n name: build-docker-image-from-git-pipeline\nspec:\n resources:\n - name: docker-source\n type: git\n - name: builtImage\n type: image\n tasks:\n - name: build-docker-image-from-git-task-run\n taskRef:\n name: build-docker-image-from-git-task\n params:\n - name: pathToDockerFile\n value: Dockerfile\n - name: pathToContext\n value: /workspace/docker-source/\n resources:\n inputs:\n - name: docker-source\n resource: docker-source\n outputs:\n - name: builtImage\n resource: builtImage\n---\napiVersion: tekton.dev/v1alpha1\nkind: PipelineRun\nmetadata:\n name: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_PROJECT_NAME}")]),a._v("-build-docker-image-from-git-pipelinerun\nspec:\n serviceAccount: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_SSH_SERVER_MODIFIED}")]),a._v("-build-bot\n pipelineRef:\n name: build-docker-image-from-git-pipeline\n resources:\n - name: docker-source\n resourceRef:\n name: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_PROJECT_NAME}")]),a._v("-project-git\n - name: builtImage\n resourceRef:\n name: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_PROJECT_NAME}")]),a._v("-project-image\nEOF")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("sleep")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[a._v("5")]),a._v("\n")])])]),e("p",[a._v("Wait for container build process will complete:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("kubectl "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("wait")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--timeout")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("10m "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--for")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("condition"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("Succeeded pipelineruns/"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_PROJECT_NAME}")]),a._v("-build-docker-image-from-git-pipelinerun\n")])])]),e("p",[a._v("Output:")]),a._v(" "),e("div",{staticClass:"language-text extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("pipelinerun.tekton.dev/my-podinfo-build-docker-image-from-git-pipelinerun condition met\n")])])]),e("p",[a._v("Start the application:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("cat")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<<")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v("EOF"),e("span",{pre:!0,attrs:{class:"token bash punctuation"}},[a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" kubectl apply "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" -")]),a._v("\napiVersion: serving.knative.dev/v1alpha1\nkind: Service\nmetadata:\n name: my-podinfo\n namespace: default\nspec:\n template:\n spec:\n containers:\n - image: "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${CONTAINER_REGISTRY}")]),a._v(":"),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${GIT_REVISION}")]),a._v("\n ports:\n - name: http1\n containerPort: 9898\nEOF")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("sleep")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[a._v("20")]),a._v("\n")])])]),e("p",[a._v("Check the status of the application:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("kubectl get pod,ksvc,configuration,revision,route,deployment\n")])])]),e("p",[a._v("Output:")]),a._v(" "),e("div",{staticClass:"language-text extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("NAME READY STATUS RESTARTS AGE\npod/my-podinfo-build-docker-image-from-git-pipelinerun-build--msbcv-pod-d6861e 0/6 Completed 0 7m56s\npod/my-podinfo-vpw78-deployment-bbb89db58-vmnhb 2/2 Running 0 21s\n\nNAME URL LATESTCREATED LATESTREADY READY REASON\nservice.serving.knative.dev/my-podinfo http://my-podinfo.default.mylabs.dev my-podinfo-vpw78 my-podinfo-vpw78 True\n\nNAME LATESTCREATED LATESTREADY READY REASON\nconfiguration.serving.knative.dev/my-podinfo my-podinfo-vpw78 my-podinfo-vpw78 True\n\nNAME CONFIG NAME K8S SERVICE NAME GENERATION READY REASON\nrevision.serving.knative.dev/my-podinfo-vpw78 my-podinfo my-podinfo-vpw78 1 True\n\nNAME URL READY REASON\nroute.serving.knative.dev/my-podinfo http://my-podinfo.default.mylabs.dev True\n\nNAME READY UP-TO-DATE AVAILABLE AGE\ndeployment.extensions/my-podinfo-vpw78-deployment 1/1 1 1 21s\n")])])]),e("p",[a._v("Open "),e("a",{attrs:{href:"https://my-podinfo.default.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://my-podinfo.default.mylabs.dev"),e("OutboundLink")],1),a._v("\nto see the application:")]),a._v(" "),e("p",[a._v("When you close the web browser - after some time without handling traffic\nthe number of running pods should drop to zero:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("kubectl get deployments,pods\n")])])]),e("p",[a._v("Output:")]),a._v(" "),e("div",{staticClass:"language-text extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("NAME READY UP-TO-DATE AVAILABLE AGE\ndeployment.extensions/my-podinfo-vpw78-deployment 1/1 1 1 22s\n\nNAME READY STATUS RESTARTS AGE\npod/my-podinfo-build-docker-image-from-git-pipelinerun-build--msbcv-pod-d6861e 0/6 Completed 0 7m57s\npod/my-podinfo-vpw78-deployment-bbb89db58-vmnhb 2/2 Running 0 22s\n")])])]),e("p",[a._v("If you open the URL again the pod should be started again and application will\nhandle the traffic - this takes about 3 seconds.")]),a._v(" "),e("p",[a._v("You can try to open the web browser with the URL "),e("a",{attrs:{href:"https://my-podinfo.default.mylabs.dev",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://my-podinfo.default.mylabs.dev"),e("OutboundLink")],1),a._v("\nagain and test it.")]),a._v(" "),e("p",[e("img",{attrs:{src:s(306),alt:"podinfo",title:"podinfo"}})])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/28.8647f919.js b/assets/js/28.8647f919.js new file mode 100644 index 0000000..6947cf8 --- /dev/null +++ b/assets/js/28.8647f919.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{309:function(t,s,a){t.exports=a.p+"assets/img/podinfo_http_https.799760ac.png"},328:function(t,s,a){"use strict";a.r(s);var e=a(8),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"knative-operations"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#knative-operations"}},[t._v("#")]),t._v(" Knative operations")]),t._v(" "),s("p",[t._v("Create service "),s("code",[t._v("my-podinfo-2")]),t._v(" with image:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("kn "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("service")]),t._v(" create my-podinfo-2 "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--port")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9898")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--image")]),t._v(" harbor.mylabs.dev/library/my-podinfo:3.1.0\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sleep")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v("\n")])])]),s("p",[t._v("Output:")]),t._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("Creating service 'my-podinfo-2' in namespace 'default':\n\n 0.205s The Route is still working to reflect the latest desired specification.\n 0.230s Configuration \"my-podinfo-2\" is waiting for a Revision to become ready.\n 7.132s ...\n 7.417s Ingress has not yet been reconciled.\n 9.415s Ready to serve.\n\nService 'my-podinfo-2' created with latest revision 'my-podinfo-2-fzhhd-1' and URL:\nhttp://my-podinfo-2.default.mylabs.dev\n")])])]),s("p",[t._v("Check if the application is really working:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-k")]),t._v(" http://my-podinfo-2.default.mylabs.dev https://my-podinfo-2.default.mylabs.dev\n")])])]),s("p",[t._v("Output:")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"hostname"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my-podinfo-2-fzhhd-1-deployment-566757c497-xvc2m"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"3.1.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"revision"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"5fb970b526dd40f9a94085fd237f0a2c3bd65520"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"color"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"blue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"message"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"greetings from podinfo v3.1.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"goos"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"linux"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"goarch"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"amd64"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"runtime"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"go1.12.14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"num_goroutine"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"num_cpu"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"hostname"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my-podinfo-2-fzhhd-1-deployment-566757c497-xvc2m"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"3.1.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"revision"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"5fb970b526dd40f9a94085fd237f0a2c3bd65520"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"color"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"blue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"message"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"greetings from podinfo v3.1.0"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"goos"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"linux"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"goarch"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"amd64"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"runtime"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"go1.12.14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"num_goroutine"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"6"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"num_cpu"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"2"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Set hard limit of concurrent requests to be processed by a single replica:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("kn "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("service")]),t._v(" update my-podinfo-2 --concurrency-limit"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n")])])]),s("p",[t._v("Output:")]),t._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("Updating Service 'my-podinfo-2' in namespace 'default':\n\n 3.050s Traffic is not yet migrated to the latest revision.\n 3.104s Ingress has not yet been reconciled.\n 4.689s Ready to serve.\n\nService 'my-podinfo-2' updated with latest revision 'my-podinfo-2-hfqhc-2' and URL:\nhttp://my-podinfo-2.default.mylabs.dev\n")])])]),s("p",[t._v("Check the pods:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("kubectl get pods\n")])])]),s("p",[t._v("Output:")]),t._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("NAME READY STATUS RESTARTS AGE\nmy-podinfo-2-fzhhd-1-deployment-566757c497-xvc2m 2/2 Running 0 48s\nmy-podinfo-2-hfqhc-2-deployment-864c8985c-jz59h 2/2 Running 0 5s\nmy-podinfo-build-docker-image-from-git-pipelinerun-build--msbcv-pod-d6861e 0/6 Completed 0 22m\n")])])]),s("p",[s("img",{attrs:{src:a(309),alt:"podinfo - http/https",title:"podinfo - http/https"}})])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/29.36e9fab6.js b/assets/js/29.36e9fab6.js new file mode 100644 index 0000000..4a2fcb7 --- /dev/null +++ b/assets/js/29.36e9fab6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{319:function(t,r,a){"use strict";a.r(r);var e=a(8),n=Object(e.a)({},(function(){var t=this,r=t._self._c;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"kubernetes-knative-gitlab-harbor"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#kubernetes-knative-gitlab-harbor"}},[t._v("#")]),t._v(" Kubernetes + Knative + GitLab + Harbor")]),t._v(" "),r("p",[r("a",{attrs:{href:"https://github.com/ruzickap/k8s-knative-gitlab-harbor",target:"_blank",rel:"noopener noreferrer"}},[r("img",{attrs:{src:"https://github.com/ruzickap/k8s-knative-gitlab-harbor/workflows/vuepress-build/badge.svg",alt:"Build Status"}}),r("OutboundLink")],1)]),t._v(" "),r("ul",[r("li",[t._v("Demo GitHub repository: "),r("a",{attrs:{href:"https://github.com/ruzickap/k8s-knative-gitlab-harbor",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/ruzickap/k8s-knative-gitlab-harbor"),r("OutboundLink")],1)]),t._v(" "),r("li",[t._v("Demo Web Pages: "),r("a",{attrs:{href:"https://ruzickap.github.io/k8s-knative-gitlab-harbor",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://ruzickap.github.io/k8s-knative-gitlab-harbor"),r("OutboundLink")],1)]),t._v(" "),r("li",[t._v("Asciinema: "),r("a",{attrs:{href:"https://asciinema.org/a/290547",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://asciinema.org/a/290547"),r("OutboundLink")],1)])]),t._v(" "),r("h2",{attrs:{id:"requirements"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://aws.amazon.com/cli/",target:"_blank",rel:"noopener noreferrer"}},[t._v("awscli"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/kubernetes-sigs/aws-iam-authenticator",target:"_blank",rel:"noopener noreferrer"}},[t._v("AWS IAM Authenticator for Kubernetes"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://aws.amazon.com/account/",target:"_blank",rel:"noopener noreferrer"}},[t._v("AWS account"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://kubernetes.io/docs/tasks/tools/install-kubectl/",target:"_blank",rel:"noopener noreferrer"}},[t._v("kubectl"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"https://github.com/kubernetes/kops",target:"_blank",rel:"noopener noreferrer"}},[t._v("kops"),r("OutboundLink")],1)]),t._v(" "),r("li",[t._v("Kubernetes, Docker, Linux, AWS knowledge required")])]),t._v(" "),r("h2",{attrs:{id:"content"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#content"}},[t._v("#")]),t._v(" Content")]),t._v(" "),r("ul",[r("li",[r("RouterLink",{attrs:{to:"/part-01/"}},[t._v('Part 01 - Create "kops" cluster')])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/part-02/"}},[t._v("Part 02 - Install Helm")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/part-03/"}},[t._v("Part 03 - Istio + cert-manager + kubed installation")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/part-04/"}},[t._v("Part 04 - Harbor installation")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/part-05/"}},[t._v("Part 05 - GitLab installation")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/part-06/"}},[t._v("Part 06 - Knative installation")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/part-07/"}},[t._v("Part 07 - Build and run container image using Knative + Tekton")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/part-08/"}},[t._v("Part 08 - Automated deployment with Tekton")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/part-09/"}},[t._v("Part 09 - Knative operations")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/part-10/"}},[t._v("Part 10 - Clean-up")])],1)]),t._v(" "),r("h2",{attrs:{id:"asciinema"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#asciinema"}},[t._v("#")]),t._v(" Asciinema")]),t._v(" "),r("p",[r("a",{attrs:{href:"https://asciinema.org/a/290547",target:"_blank",rel:"noopener noreferrer"}},[r("img",{attrs:{src:"https://asciinema.org/a/290547.svg",alt:"asciicast"}}),r("OutboundLink")],1)])])}),[],!1,null,null,null);r.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/3.6b4152e0.js b/assets/js/3.6b4152e0.js new file mode 100644 index 0000000..65c4181 --- /dev/null +++ b/assets/js/3.6b4152e0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3,18,19],{246:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return s})),n.d(e,"i",(function(){return a})),n.d(e,"f",(function(){return l})),n.d(e,"g",(function(){return u})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return p})),n.d(e,"e",(function(){return d})),n.d(e,"k",(function(){return h})),n.d(e,"l",(function(){return f})),n.d(e,"c",(function(){return g})),n.d(e,"j",(function(){return m}));n(92);const r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,a=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function l(t){return a.test(t)}function u(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function p(t){if(l(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return s.test(i)?t:i+".html"+n}function d(t,e){const n=decodeURIComponent(t.hash),i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function h(t,e,n){if(l(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const s=t.replace(/^\//,"").split("/");for(let t=0;tfunction t(e,n,r,i=1){if("string"==typeof e)return h(n,e,r);if(Array.isArray(e))return Object.assign(h(n,e[0],r),{title:e[1]});{const s=e.children||[];return 0===s.length&&e.path?Object.assign(h(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:s.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(t,i,n)):[]}return[]}function b(t){const e=g(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}function g(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},247:function(t,e,n){},249:function(t,e,n){"use strict";n.r(e);var r={name:"DropdownTransition",methods:{setHeight(t){t.style.height=t.scrollHeight+"px"},unsetHeight(t){t.style.height=""}}},i=(n(250),n(8)),s=Object(i.a)(r,(function(){return(0,this._self._c)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.default=s.exports},250:function(t,e,n){"use strict";n(247)},252:function(t,e,n){},257:function(t,e,n){},259:function(t,e,n){"use strict";n(252)},260:function(t,e,n){"use strict";n.r(e);var r=n(273),i=n(262),s=n(246);function a(t,e){if("group"===e.type){const n=e.path&&Object(s.e)(t,e.path),r=e.children.some(e=>"group"===e.type?a(t,e):"page"===e.type&&Object(s.e)(t,e.path));return n||r}return!1}var o={name:"SidebarLinks",components:{SidebarGroup:r.default,SidebarLink:i.default},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route(){this.refreshIndex()}},created(){this.refreshIndex()},methods:{refreshIndex(){const t=function(t,e){for(let n=0;n-1&&(this.openGroupIndex=t)},toggleGroup(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive(t){return Object(s.e)(this.$route,t.regularPath)}}},l=n(8),u=Object(l.a)(o,(function(){var t=this,e=t._self._c;return t.items.length?e("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(n,r){return e("li",{key:r},["group"===n.type?e("SidebarGroup",{attrs:{item:n,open:r===t.openGroupIndex,collapsable:n.collapsable||n.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(r)}}}):e("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:n}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=u.exports},262:function(t,e,n){"use strict";n.r(e);var r=n(246);function i(t,e,n,r,i){const s={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(s.style={"padding-left":i+"rem"}),t("RouterLink",s,n)}function s(t,e,n,a,o,l=1){return!e||l>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const u=Object(r.e)(a,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,u,e.level-1),s(t,e.children,n,a,o,l+1)])}))}var a={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:a,$themeConfig:o,$themeLocaleConfig:l},props:{item:u,sidebarDepth:c}}){const p=Object(r.e)(a,u.path),d="auto"===u.type?p||u.children.some(t=>Object(r.e)(a,u.basePath+"#"+t.slug)):p,h="external"===u.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,u.path,u.title||u.path):i(t,u.path,u.title||u.path,d),f=[e.frontmatter.sidebarDepth,c,l.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=l.displayAllHeaders||o.displayAllHeaders;if("auto"===u.type)return[h,s(t,u.children,u.basePath,a,f)];if((d||b)&&u.headers&&!r.d.test(u.path)){return[h,s(t,Object(r.c)(u.headers),u.path,a,f)]}return h}},o=(n(259),n(8)),l=Object(o.a)(a,void 0,void 0,!1,null,null,null);e.default=l.exports},270:function(t,e,n){"use strict";n(257)},273:function(t,e,n){"use strict";n.r(e);var r=n(246),i={name:"SidebarGroup",components:{DropdownTransition:n(249).default},props:["item","open","collapsable","depth"],beforeCreate(){this.$options.components.SidebarLinks=n(260).default},methods:{isActive:r.e}},s=(n(270),n(8)),a=Object(s.a)(i,(function(){var t=this,e=t._self._c;return e("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?e("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):e("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[e("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?e("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),e("DropdownTransition",[t.open||!t.collapsable?e("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/30.f81551c9.js b/assets/js/30.f81551c9.js new file mode 100644 index 0000000..6513022 --- /dev/null +++ b/assets/js/30.f81551c9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{320:function(a,s,t){"use strict";t.r(s);var e=t(8),r=Object(e.a)({},(function(){var a=this,s=a._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"create-k8s-cluster"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-k8s-cluster"}},[a._v("#")]),a._v(" Create k8s cluster")]),a._v(" "),s("p",[a._v("Before starting with the main content, it's necessary to provision\nthe Kubernetes in AWS.")]),a._v(" "),s("p",[a._v("Use the "),s("code",[a._v("MY_DOMAIN")]),a._v(" variable containing domain and "),s("code",[a._v("LETSENCRYPT_ENVIRONMENT")]),a._v("\nvariable.\nThe "),s("code",[a._v("LETSENCRYPT_ENVIRONMENT")]),a._v(" variable should be one of:")]),a._v(" "),s("ul",[s("li",[s("p",[s("code",[a._v("staging")]),a._v(" - Let’s Encrypt will create testing certificate (not valid)")])]),a._v(" "),s("li",[s("p",[s("code",[a._v("production")]),a._v(" - Let’s Encrypt will create valid certificate (use with care)")])])]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("MY_DOMAIN")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":-")]),a._v("mylabs.dev}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("LETSENCRYPT_ENVIRONMENT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":-")]),a._v("staging}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" | "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v('"')]),a._v("\n")])])]),s("h2",{attrs:{id:"prepare-the-local-working-environment"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prepare-the-local-working-environment"}},[a._v("#")]),a._v(" Prepare the local working environment")]),a._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[a._v("TIP")]),a._v(" "),s("p",[a._v("You can skip these steps if you have all the required software already\ninstalled.")])]),a._v(" "),s("p",[a._v("Install necessary software:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-x")]),a._v(" /usr/bin/apt "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("apt")]),a._v(" update "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-qq")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("DEBIAN_FRONTEND")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("noninteractive "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("apt-get")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-y")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-qq")]),a._v(" awscli "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" docker.io gettext-base "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("git")]),a._v(" jq openssh-client "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" /dev/null\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])]),s("p",[a._v("Install "),s("a",{attrs:{href:"https://github.com/kubernetes/kubectl",target:"_blank",rel:"noopener noreferrer"}},[a._v("kubectl"),s("OutboundLink")],1),a._v(" binary:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-x")]),a._v(" /usr/local/bin/kubectl "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-Lo")]),a._v(" /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/"),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" https://storage.googleapis.com/kubernetes-release/release/stable.txt"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("/bin/linux/amd64/kubectl\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("chmod")]),a._v(" a+x /usr/local/bin/kubectl\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])]),s("p",[a._v("Install "),s("a",{attrs:{href:"https://github.com/kubernetes/kops",target:"_blank",rel:"noopener noreferrer"}},[a._v("kops"),s("OutboundLink")],1),a._v(":")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-x")]),a._v(" /usr/local/bin/kops "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-LO")]),a._v(" https://github.com/kubernetes/kops/releases/download/"),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" https://api.github.com/repos/kubernetes/kops/releases/latest "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-r")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'.tag_name'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("/kops-linux-amd64\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("chmod")]),a._v(" +x kops-linux-amd64\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("mv")]),a._v(" kops-linux-amd64 /usr/local/bin/kops\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])]),s("p",[a._v("Install "),s("code",[a._v("kn")]),a._v(" client for Knative:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-x")]),a._v(" /usr/local/bin/kn "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-L")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://github.com/knative/client/releases/download/v0.11.0/kn-linux-amd64"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-o")]),a._v(" /usr/local/bin/kn\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("chmod")]),a._v(" a+x /usr/local/bin/kn\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])]),s("p",[a._v("Install "),s("code",[a._v("tkn")]),a._v(" client for Tekton:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-x")]),a._v(" /usr/local/bin/tkn "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-L")]),a._v(" https://github.com/tektoncd/cli/releases/download/v0.6.0/tkn_0.6.0_Linux_x86_64.tar.gz "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" xzf - "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-C")]),a._v(" /tmp/\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("mv")]),a._v(" /tmp/tkn /usr/local/bin/\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])]),s("p",[a._v("Install "),s("a",{attrs:{href:"https://hub.github.com/",target:"_blank",rel:"noopener noreferrer"}},[a._v("hub"),s("OutboundLink")],1),a._v(":")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-x")]),a._v(" /usr/local/bin/hub "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-L")]),a._v(" https://github.com/github/hub/releases/download/v2.13.0/hub-linux-amd64-2.13.0.tgz "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" xzf - "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-C")]),a._v(" /tmp/\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("mv")]),a._v(" /tmp/hub-linux-amd64-2.13.0/bin/hub /usr/local/bin/\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])]),s("h2",{attrs:{id:"configure-aws"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configure-aws"}},[a._v("#")]),a._v(" Configure AWS")]),a._v(" "),s("p",[a._v("Authorize to AWS using AWS CLI: "),s("a",{attrs:{href:"https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html",target:"_blank",rel:"noopener noreferrer"}},[a._v("Configuring the AWS CLI"),s("OutboundLink")],1)]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws configure\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("..")]),a._v(".\n")])])]),s("p",[a._v("Create DNS zone:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws route53 create-hosted-zone "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--name")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" --caller-reference "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n")])])]),s("p",[a._v("Use your domain registrar to change the nameservers for your zone (for example\n"),s("code",[a._v("mylabs.dev")]),a._v(") to use the Amazon Route 53 nameservers. Here is the way how you\ncan find out the the Route 53 nameservers:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws route53 get-hosted-zone "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--id")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("aws route53 list-hosted-zones "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"HostedZones[?Name==\\'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")]),a._v("$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")])]),a._v('].Id"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),a._v(" text"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"DelegationSet.NameServers"')]),a._v("\n")])])]),s("p",[a._v("Create policy allowing the cert-manager to change Route 53 settings. This will\nallow cert-manager to generate wildcard SSL certificates by Let's Encrypt\ncertificate authority.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("test")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" tmp "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("||")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("mkdir")]),a._v(" tmp\nenvsubst "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v(" files/user_policy.json "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" tmp/user_policy.json\n\naws iam create-policy "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --policy-name "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--description")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Policy for '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --policy-document file://tmp/user_policy.json "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Policy"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"PolicyName"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"pruzicka-k8s-mylabs.dev"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"PolicyId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"xxxxxxxxxxxxxxxxxxxx"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Arn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"arn:aws:iam::822044714040:policy/pruzicka-k8s-mylabs.dev"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Path"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"DefaultVersionId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"v1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"AttachmentCount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"PermissionsBoundaryUsageCount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"IsAttachable"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[a._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"CreateDate"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"2019-12-27T09:41:14Z"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"UpdateDate"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"2019-12-27T09:41:14Z"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("Create user which will use the policy above:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws iam create-user --user-name "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("POLICY_ARN")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("aws iam list-policies "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Policies[?PolicyName==\\'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")]),a._v("$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-k8s-$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")])]),a._v('].{ARN:Arn}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),a._v(" text"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\naws iam attach-user-policy --user-name "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('"')]),a._v(" --policy-arn "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$POLICY_ARN")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\naws iam create-access-key --user-name "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.aws/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("USER_AWS_ACCESS_KEY_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("awk")]),a._v(" -F"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v('" '),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"/AccessKeyId/ { print \\'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$4")]),a._v(' }"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.aws/$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-k8s-$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("USER_AWS_SECRET_ACCESS_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("awk")]),a._v(" -F"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v('" '),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"/SecretAccessKey/ { print \\'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$4")]),a._v(' }"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.aws/$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-k8s-$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v("\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"User"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Path"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"UserName"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"pruzicka-k8s-mylabs.dev"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"UserId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"xxxxxxxxxxxxxxxxxxxx"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Arn"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"arn:aws:iam::822044714040:user/pruzicka-k8s-mylabs.dev"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(",")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"CreateDate"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"2019-12-27T09:41:27Z"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("The "),s("code",[a._v("AccessKeyId")]),a._v(" and "),s("code",[a._v("SecretAccessKey")]),a._v(" is need for creating the "),s("code",[a._v("ClusterIssuer")]),a._v("\ndefinition for "),s("code",[a._v("cert-manager")]),a._v(".")]),a._v(" "),s("h2",{attrs:{id:"create-k8s-in-aws"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-k8s-in-aws"}},[a._v("#")]),a._v(" Create K8s in AWS")]),a._v(" "),s("p",[s("img",{attrs:{src:"https://raw.githubusercontent.com/aws-samples/eks-workshop/65b766c494a5b4f5420b2912d8373c4957163541/static/images/3-service-animated.gif",alt:"Architecture",title:"Architecture"}})]),a._v(" "),s("p",[a._v("Generate SSH keys if not exists:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("test")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.ssh/id_rsa "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("||")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-m")]),a._v(" 0700 "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.ssh "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" ssh-keygen "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-b")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("2048")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-t")]),a._v(" rsa "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.ssh/id_rsa "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-q")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-N")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('""')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v("\n")])])]),s("p",[a._v("Clone the "),s("code",[a._v("k8s-knative-gitlab-harbor")]),a._v(" Git repository if it wasn't done already:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("!")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" .git "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("git")]),a._v(" clone "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--quiet")]),a._v(" https://github.com/ruzickap/k8s-k8s-knative-gitlab-harbor "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("cd")]),a._v(" k8s-knative-gitlab-harbor\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])]),s("p",[a._v("Create S3 bucket where the kops will store cluster status:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws s3api create-bucket "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--bucket")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-kops-k8s "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--region")]),a._v(" eu-central-1 --create-bucket-configuration "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("LocationConstraint")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("eu-central-1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[a._v('"Location"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v(":")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"http://pruzicka-kops-k8s.s3.amazonaws.com/"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("\n")])])]),s("p",[a._v("Create Kubernetes cluster in AWS by using "),s("a",{attrs:{href:"https://github.com/kubernetes/kops",target:"_blank",rel:"noopener noreferrer"}},[a._v("kops"),s("OutboundLink")],1),a._v(":")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("kops create cluster "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s."),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--state")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("s3://"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-kops-k8s "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--zones")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("eu-central-1a "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--networking")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("amazon-vpc-routed-eni "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --node-count"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("5")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --node-size"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("t3.large "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --node-volume-size"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("20")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --master-count"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --master-size"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("t3.small "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --master-volume-size"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("10")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --dns-zone"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --cloud-labels "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Owner='),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v(',Environment=Test,Division=Services"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n --ssh-public-key "),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$HOME")]),a._v("/.ssh/id_rsa.pub "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--yes")]),a._v("\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("...\nI1227 10:42:09.459809 15782 executor.go:103] Tasks: 91 done / 91 total; 0 can run\nI1227 10:42:09.459901 15782 dns.go:155] Pre-creating DNS records\nI1227 10:42:10.791005 15782 update_cluster.go:294] Exporting kubecfg for cluster\nkops has set your kubectl context to pruzicka-k8s.mylabs.dev\n\nCluster changes have been applied to the cloud.\n\n\nChanges may require instances to restart: kops rolling-update cluster\n")])])]),s("p",[a._v("Wait for cluster to be up and running:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sleep")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("200")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("while")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")]),a._v("kops validate cluster "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--state")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("s3://$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-kops-k8s "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-o")]),a._v(" yaml "),s("span",{pre:!0,attrs:{class:"token operator"}},[s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[a._v("2")]),a._v(">")]),s("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[a._v("&1")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("grep")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-q")]),a._v(" failures"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("do")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sleep")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-n")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("done")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v("\n")])])]),s("p",[a._v("Store "),s("code",[a._v("kubeconfig")]),a._v(" in current directory:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("kops "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" kubecfg "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s."),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--state")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("s3://"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-kops-k8s "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--kubeconfig")]),a._v(" kubeconfig.conf\n")])])]),s("p",[a._v("Check if the new Kubernetes cluster is available:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("KUBECONFIG")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$PWD")]),a._v("/kubeconfig.conf\nkubectl get nodes "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-o")]),a._v(" wide\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME\nip-172-20-37-106.eu-central-1.compute.internal Ready master 2m23s v1.15.6 172.20.37.106 35.159.31.183 Debian GNU/Linux 9 (stretch) 4.9.0-11-amd64 docker://18.6.3\nip-172-20-37-122.eu-central-1.compute.internal Ready node 56s v1.15.6 172.20.37.122 3.120.151.131 Debian GNU/Linux 9 (stretch) 4.9.0-11-amd64 docker://18.6.3\nip-172-20-37-204.eu-central-1.compute.internal Ready node 32s v1.15.6 172.20.37.204 18.196.187.216 Debian GNU/Linux 9 (stretch) 4.9.0-11-amd64 docker://18.6.3\nip-172-20-47-14.eu-central-1.compute.internal Ready node 67s v1.15.6 172.20.47.14 18.196.173.69 Debian GNU/Linux 9 (stretch) 4.9.0-11-amd64 docker://18.6.3\nip-172-20-47-61.eu-central-1.compute.internal Ready node 53s v1.15.6 172.20.47.61 18.184.73.151 Debian GNU/Linux 9 (stretch) 4.9.0-11-amd64 docker://18.6.3\nip-172-20-59-57.eu-central-1.compute.internal Ready node 83s v1.15.6 172.20.59.57 54.93.48.121 Debian GNU/Linux 9 (stretch) 4.9.0-11-amd64 docker://18.6.3\n")])])]),s("p",[a._v("In case of using "),s("code",[a._v("staging")]),a._v(' environment add "Let\'s Encrypt testing" '),s("a",{attrs:{href:"https://letsencrypt.org/certs/fakelerootx1.pem",target:"_blank",rel:"noopener noreferrer"}},[a._v("fakelerootx1.pem"),s("OutboundLink")],1),a._v("\nas trusted certificate authority:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("wget")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-q")]),a._v(" https://letsencrypt.org/certs/fakelerootx1.pem "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-O")]),a._v(" tmp/fakelerootx1.pem\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("if")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${LETSENCRYPT_ENVIRONMENT}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"staging"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("then")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("mkdir")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-pv")]),a._v(" /etc/docker/certs.d/harbor."),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("cp")]),a._v(" tmp/fakelerootx1.pem /etc/docker/certs.d/harbor."),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/ca.crt\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("for")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token for-or-select variable"}},[a._v("EXTERNAL_IP")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("in")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("kubectl get nodes "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("jsonpath"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{.items[*].status.addresses[?(@.type=='),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v("ExternalIP"),s("span",{pre:!0,attrs:{class:"token entity",title:'\\"'}},[a._v('\\"')]),a._v(')].address}"')]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("do")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("ssh")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-q")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-o")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("StrictHostKeyChecking")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("no "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-l")]),a._v(" admin "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${EXTERNAL_IP}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"sudo mkdir -p /etc/docker/certs.d/harbor.'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("/ && sudo wget -q https://letsencrypt.org/certs/fakelerootx1.pem -O /etc/docker/certs.d/harbor."),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('/ca.crt"')]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("done")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"*** Done"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[a._v("fi")]),a._v("\n")])])])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/31.ed17542f.js b/assets/js/31.ed17542f.js new file mode 100644 index 0000000..cb50bd8 --- /dev/null +++ b/assets/js/31.ed17542f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{321:function(t,a,e){"use strict";e.r(a);var s=e(8),n=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"install-helm"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-helm"}},[t._v("#")]),t._v(" Install Helm")]),t._v(" "),a("p",[t._v("Install "),a("a",{attrs:{href:"https://helm.sh/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Helm"),a("OutboundLink")],1),t._v(" binary:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("bash")]),t._v("\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("Downloading https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz\nPreparing to install helm into /usr/local/bin\nhelm installed into /usr/local/bin/helm\n")])])]),a("p",[t._v('Add the "stable" repository:')]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("helm repo "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" stable https://kubernetes-charts.storage.googleapis.com/\nhelm repo update\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v('"stable" has been added to your repositories\nHang tight while we grab the latest from your chart repositories...\n...Successfully got an update from the "stable" chart repository\nUpdate Complete. ⎈ Happy Helming!⎈\n')])])]),a("p",[t._v("Install kube2iam to restrict pod's access:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("helm "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" kube2iam stable/kube2iam "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--namespace")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("kube-system "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("host.iptables")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--set")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("rbac.create")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true\n")])])]),a("p",[t._v("Output:")]),t._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v('NAME: kube2iam\nLAST DEPLOYED: Fri Dec 27 10:48:20 2019\nNAMESPACE: kube-system\nSTATUS: deployed\nREVISION: 1\nTEST SUITE: None\nNOTES:\nTo verify that kube2iam has started, run:\n\n kubectl --namespace=kube-system get pods -l "app.kubernetes.io/name=kube2iam,app.kubernetes.io/instance=kube2iam"\n\nAdd an iam.amazonaws.com/role annotation to your pods with the role you want them to assume.\n\n https://github.com/jtblin/kube2iam#kubernetes-annotation\n\nUse `curl` to verify the pod\'s role from within:\n\n curl http://169.254.169.254/latest/meta-data/iam/security-credentials/\n')])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/32.22ccabcf.js b/assets/js/32.22ccabcf.js new file mode 100644 index 0000000..515f21a --- /dev/null +++ b/assets/js/32.22ccabcf.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{329:function(a,s,t){"use strict";t.r(s);var e=t(8),n=Object(e.a)({},(function(){var a=this,s=a._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"clean-up"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#clean-up"}},[a._v("#")]),a._v(" Clean-up")]),a._v(" "),s("p",[s("img",{attrs:{src:"https://raw.githubusercontent.com/aws-samples/eks-workshop/65b766c494a5b4f5420b2912d8373c4957163541/static/images/cleanup.svg?sanitize=true",alt:"Clean-up",title:"Clean-up"}})]),a._v(" "),s("p",[a._v("Configure "),s("code",[a._v("kubeconfig")]),a._v(":")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("MY_DOMAIN")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"mylabs.dev"')]),a._v("\nkops "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" kubecfg "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s."),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--state")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("s3://"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-kops-k8s "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--kubeconfig")]),a._v(" /tmp/kubeconfig.conf\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("KUBECONFIG")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/tmp/kubeconfig.conf\n")])])]),s("p",[a._v("Remove DNS records:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("kubectl delete gateways.networking.istio.io "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--all")]),a._v(" --all-namespaces "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\nkubectl delete pod "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-n")]),a._v(" external-dns "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--all")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sleep")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("15")]),a._v("\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v('gateway.networking.istio.io "el-getting-started-listener-gateway" deleted\ngateway.networking.istio.io "gitlab-gateway" deleted\ngateway.networking.istio.io "harbor-gateway" deleted\ngateway.networking.istio.io "istio-autogenerated-k8s-ingress" deleted\ngateway.networking.istio.io "istio-services-gateway" deleted\ngateway.networking.istio.io "knative-services-gateway" deleted\ngateway.networking.istio.io "cluster-local-gateway" deleted\ngateway.networking.istio.io "knative-ingress-gateway" deleted\npod "external-dns-685b847795-mrchv" deleted\n')])])]),s("p",[a._v("Delete GitHub repositories:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("hub delete "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-y")]),a._v(" ruzickap/podinfo\n")])])]),s("p",[a._v("Cleanup + Remove Helm:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("test")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" /home/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("/.helm "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-rf")]),a._v(" /home/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("/.helm\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("test")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" /home/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("/.config/helm "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-rf")]),a._v(" /home/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("/.config/helm\n")])])]),s("p",[a._v("Cleanup + Remove "),s("code",[a._v("tmp")]),a._v(" directory:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-rf")]),a._v(" tmp\n")])])]),s("p",[a._v("Docker certificate cleanup if exists:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("sudo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-rf")]),a._v(" /etc/docker/certs.d/harbor."),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n")])])]),s("p",[a._v("Remove K8s cluster:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("kops delete cluster "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s."),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--yes")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--state")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("s3://"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-kops-k8s\n")])])]),s("p",[a._v("Output:")]),a._v(" "),s("div",{staticClass:"language-text extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("...\nDeleted kubectl config for pruzicka-k8s.mylabs.de\n")])])]),s("p",[a._v("Remove S3 bucket used for storing the configuration by kops:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("aws s3 "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" s3://"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-kops-k8s/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-app-build.tar\naws s3api delete-bucket "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--bucket")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-kops-k8s "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--region")]),a._v(" eu-central-1\n")])])]),s("p",[a._v("Clean Policy, User, Access Key in AWS:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v('# aws route53 delete-hosted-zone --id $(aws route53 list-hosted-zones --query "HostedZones[?Name==\\`${MY_DOMAIN}.\\`].Id" --output text)')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("POLICY_ARN")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("aws iam list-policies "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Policies[?PolicyName==\\'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")]),a._v("$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-k8s-$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("`")])]),a._v('].{ARN:Arn}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),a._v(" text"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\naws iam detach-user-policy --user-name "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v('"')]),a._v(" --policy-arn "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${POLICY_ARN}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\naws iam delete-policy --policy-arn "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${POLICY_ARN}")]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("USER_ACCESS_KEYS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),a._v("aws iam list-access-keys --user-name $"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v("-k8s-$"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("{")]),a._v("MY_DOMAIN"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("}")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--query")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"AccessKeyMetadata[].AccessKeyId"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--output")]),a._v(" text"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&&")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\naws iam delete-access-key --user-name "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v(" --access-key-id "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${USER_ACCESS_KEYS}")]),a._v("\n\naws iam delete-user --user-name "),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")]),a._v("}")]),a._v("-k8s-"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("${MY_DOMAIN}")]),a._v("\n")])])]),s("p",[a._v("Remove other files:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" demo-magic.sh kubeconfig.conf README.sh "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("&>")]),a._v(" /dev/null\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/4.1a6ad45d.js b/assets/js/4.1a6ad45d.js new file mode 100644 index 0000000..81d6e20 --- /dev/null +++ b/assets/js/4.1a6ad45d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{284:function(t,e,n){},298:function(t,e,n){"use strict";n(284)},318:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:(t,{props:e,slots:n})=>t("span",{class:["badge",e.type],style:{verticalAlign:e.vertical}},e.text||n().default)},p=(n(298),n(8)),l=Object(p.a)(i,void 0,void 0,!1,null,"15b7b770",null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/5.4b4e299e.js b/assets/js/5.4b4e299e.js new file mode 100644 index 0000000..ccdfff1 --- /dev/null +++ b/assets/js/5.4b4e299e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{285:function(t,e,a){},299:function(t,e,a){"use strict";a(285)},314:function(t,e,a){"use strict";a.r(e);var s={name:"CodeBlock",props:{title:{type:String,required:!0},active:{type:Boolean,default:!1}},mounted(){this.$parent&&this.$parent.loadTabs&&this.$parent.loadTabs()}},i=(a(299),a(8)),n=Object(i.a)(s,(function(){return(0,this._self._c)("div",{staticClass:"theme-code-block",class:{"theme-code-block__active":this.active}},[this._t("default")],2)}),[],!1,null,"759a7d02",null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/6.88072c68.js b/assets/js/6.88072c68.js new file mode 100644 index 0000000..6a3e20e --- /dev/null +++ b/assets/js/6.88072c68.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{286:function(e,t,a){},300:function(e,t,a){"use strict";a(286)},315:function(e,t,a){"use strict";a.r(t);var o={name:"CodeGroup",data:()=>({codeTabs:[],activeCodeTabIndex:-1}),watch:{activeCodeTabIndex(e){this.activateCodeTab(e)}},mounted(){this.loadTabs()},methods:{changeCodeTab(e){this.activeCodeTabIndex=e},loadTabs(){this.codeTabs=(this.$slots.default||[]).filter(e=>Boolean(e.componentOptions)).map((e,t)=>(""===e.componentOptions.propsData.active&&(this.activeCodeTabIndex=t),{title:e.componentOptions.propsData.title,elm:e.elm})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0),this.activateCodeTab(0)},activateCodeTab(e){this.codeTabs.forEach(e=>{e.elm&&e.elm.classList.remove("theme-code-block__active")}),this.codeTabs[e].elm&&this.codeTabs[e].elm.classList.add("theme-code-block__active")}}},s=(a(300),a(8)),c=Object(s.a)(o,(function(){var e=this,t=e._self._c;return t("ClientOnly",[t("div",{staticClass:"theme-code-group"},[t("div",{staticClass:"theme-code-group__nav"},[t("ul",{staticClass:"theme-code-group__ul"},e._l(e.codeTabs,(function(a,o){return t("li",{key:a.title,staticClass:"theme-code-group__li"},[t("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":o===e.activeCodeTabIndex},on:{click:function(t){return e.changeCodeTab(o)}}},[e._v("\n "+e._s(a.title)+"\n ")])])})),0)]),e._v(" "),e._t("default"),e._v(" "),e.codeTabs.length<1?t("pre",{staticClass:"pre-blank"},[e._v("// Make sure to add code blocks to your code group")]):e._e()],2)])}),[],!1,null,"deefee04",null);t.default=c.exports}}]); \ No newline at end of file diff --git a/assets/js/7.f09a9532.js b/assets/js/7.f09a9532.js new file mode 100644 index 0000000..f31a02c --- /dev/null +++ b/assets/js/7.f09a9532.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{316:function(t,e,s){"use strict";s.r(e);const o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var n={methods:{getMsg:()=>o[Math.floor(Math.random()*o.length)]}},h=s(8),i=Object(h.a)(n,(function(){var t=this._self._c;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"theme-default-content"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/app.6e1ee497.js b/assets/js/app.6e1ee497.js new file mode 100644 index 0000000..5eefaa5 --- /dev/null +++ b/assets/js/app.6e1ee497.js @@ -0,0 +1,16 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],c=e[1],u=e[2],f=0,p=[];f=e||n<0||m&&t-u>=i}function w(){var t=d();if(_(t))return x(t);s=setTimeout(w,function(t){var n=e-(t-c);return m?p(n,i-(t-u)):n}(t))}function x(t){return s=void 0,g&&r?y(t):(r=o=void 0,a)}function O(){var t=d(),n=_(t);if(r=arguments,o=this,c=t,n){if(void 0===s)return b(c);if(m)return s=setTimeout(w,e),y(c)}return void 0===s&&(s=setTimeout(w,e)),a}return e=v(e)||0,h(n)&&(l=!!n.leading,i=(m="maxWait"in n)?f(v(n.maxWait)||0,e):i,g="trailing"in n?!!n.trailing:g),O.cancel=function(){void 0!==s&&clearTimeout(s),u=0,r=c=o=s=void 0},O.flush=function(){return void 0===s?a:x(d())},O}},function(t,e,n){var r,o; +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */void 0===(o="function"==typeof(r=function(){var t,e,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var c=n.render(!e),u=c.querySelector(r.barSelector),l=r.speed,f=r.easing;return c.offsetWidth,a((function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,l,f)),1===t?(s(c,{transition:"none",opacity:1}),c.offsetWidth,setTimeout((function(){s(c,{transition:"all "+l+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),l)}),l)):setTimeout(e,l)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout((function(){n.status&&(n.trickle(),t())}),r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),c=t?"-100":i(n.status||0),l=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+c+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),l!=document.body&&u(l,"nprogress-custom-parent"),l.appendChild(e),e},n.remove=function(){l(document.documentElement,"nprogress-busy"),l(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function c(t,e){return("string"==typeof t?t:f(t)).indexOf(" "+e+" ")>=0}function u(t,e){var n=f(t),r=n+e;c(n,e)||(t.className=r.substring(1))}function l(t,e){var n,r=f(t);c(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e,n){"use strict";var r=n(0),o=n(46).f,i=n(13),a=n(94),s=n(34),c=n(61),u=n(122);t.exports=function(t,e){var n,l,f,p,d,h=t.target,v=t.global,m=t.stat;if(n=v?r:m?r[h]||s(h,{}):r[h]&&r[h].prototype)for(l in e){if(p=e[l],f=t.dontCallGetSet?(d=o(n,l))&&d.value:n[l],!u(v?l:h+(m?".":"#")+l,t.forced)&&void 0!==f){if(typeof p==typeof f)continue;c(p,f)}(t.sham||f&&f.sham)&&i(p,"sham",!0),a(n,l,p,t)}}},function(t,e,n){"use strict";var r=n(26),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(t,e,n){"use strict";var r=n(3);t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},function(t,e,n){"use strict";t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,n){"use strict";var r=n(47),o=n(29);t.exports=function(t){return r(o(t))}},function(t,e,n){"use strict";var r=n(48),o=TypeError;t.exports=function(t){if(r(t))throw new o("Can't call method on "+t);return t}},function(t,e,n){"use strict";var r=n(0),o=n(1),i=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t]):r[t]&&r[t][e]}},function(t,e,n){"use strict";var r=n(1),o=n(104),i=TypeError;t.exports=function(t){if(r(t))return t;throw new i(o(t)+" is not a function")}},function(t,e,n){"use strict";var r=n(0),o=n(55),i=n(9),a=n(57),s=n(53),c=n(52),u=r.Symbol,l=o("wks"),f=c?u.for||u:u&&u.withoutSetter||a;t.exports=function(t){return i(l,t)||(l[t]=s&&i(u,t)?u[t]:f("Symbol."+t)),l[t]}},function(t,e,n){"use strict";var r=n(56),o=n(0),i=n(34),a=t.exports=o["__core-js_shared__"]||i("__core-js_shared__",{});(a.versions||(a.versions=[])).push({version:"3.36.1",mode:r?"pure":"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.36.1/LICENSE",source:"https://github.com/zloirock/core-js"})},function(t,e,n){"use strict";var r=n(0),o=Object.defineProperty;t.exports=function(t,e){try{o(r,t,{value:e,configurable:!0,writable:!0})}catch(n){r[t]=e}return e}},function(t,e,n){"use strict";var r=n(29),o=Object;t.exports=function(t){return o(r(t))}},function(t,e,n){"use strict";var r=n(119);t.exports=function(t){return r(t.length)}},function(t,e,n){var r=n(146),o=n(11),i=Object.prototype,a=i.hasOwnProperty,s=i.propertyIsEnumerable,c=r(function(){return arguments}())?r:function(t){return o(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=c},function(t,e,n){var r=n(10)(n(7),"Map");t.exports=r},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e,n){var r=n(166),o=n(173),i=n(175),a=n(176),s=n(177);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){var r=n(4),o=n(44),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function(t,e){if(r(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!o(t))||(a.test(t)||!i.test(t)||null!=e&&t in Object(e))}},function(t,e,n){var r=n(12),o=n(11);t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==r(t)}},function(t,e){t.exports=function(t){return t}},function(t,e,n){"use strict";var r=n(5),o=n(25),i=n(100),a=n(27),s=n(28),c=n(49),u=n(9),l=n(58),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=s(t),e=c(e),l)try{return f(t,e)}catch(t){}if(u(t,e))return a(!o(i.f,t,e),t[e])}},function(t,e,n){"use strict";var r=n(2),o=n(3),i=n(16),a=Object,s=r("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"===i(t)?s(t,""):a(t)}:a},function(t,e,n){"use strict";t.exports=function(t){return null==t}},function(t,e,n){"use strict";var r=n(101),o=n(50);t.exports=function(t){var e=r(t,"string");return o(e)?e:e+""}},function(t,e,n){"use strict";var r=n(30),o=n(1),i=n(51),a=n(52),s=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=r("Symbol");return o(e)&&i(e.prototype,s(t))}},function(t,e,n){"use strict";var r=n(2);t.exports=r({}.isPrototypeOf)},function(t,e,n){"use strict";var r=n(53);t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,e,n){"use strict";var r=n(54),o=n(3),i=n(0).String;t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol("symbol detection");return!i(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(t,e,n){"use strict";var r,o,i=n(0),a=n(102),s=i.process,c=i.Deno,u=s&&s.versions||c&&c.version,l=u&&u.v8;l&&(o=(r=l.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),t.exports=o},function(t,e,n){"use strict";var r=n(33);t.exports=function(t,e){return r[t]||(r[t]=e||{})}},function(t,e,n){"use strict";t.exports=!1},function(t,e,n){"use strict";var r=n(2),o=0,i=Math.random(),a=r(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++o+i,36)}},function(t,e,n){"use strict";var r=n(5),o=n(3),i=n(106);t.exports=!r&&!o((function(){return 7!==Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){"use strict";var r=n(6),o=String,i=TypeError;t.exports=function(t){if(r(t))return t;throw new i(o(t)+" is not an object")}},function(t,e,n){"use strict";t.exports={}},function(t,e,n){"use strict";var r=n(9),o=n(113),i=n(46),a=n(15);t.exports=function(t,e,n){for(var s=o(e),c=a.f,u=i.f,l=0;ll))return!1;var p=c.get(t),d=c.get(e);if(p&&d)return p==e&&d==t;var h=-1,v=!0,m=2&n?new r:void 0;for(c.set(t,e),c.set(e,t);++h-1&&t%1==0&&t]/;t.exports=function(t){var e,n=""+t,o=r.exec(n);if(!o)return n;var i="",a=0,s=0;for(a=o.index;a1?1:s,n=.5*(1-Math.cos(Math.PI*a)),r=e.startX+(e.x-e.startX)*n,o=e.startY+(e.y-e.startY)*n,e.method.call(e.scrollable,r,o),r===e.x&&o===e.y||t.requestAnimationFrame(d.bind(t,e))}function h(n,r,a){var c,u,l,f,p=i();n===e.body?(c=t,u=t.scrollX||t.pageXOffset,l=t.scrollY||t.pageYOffset,f=o.scroll):(c=n,u=n.scrollLeft,l=n.scrollTop,f=s),d({scrollable:c,method:f,startTime:p,startX:u,startY:l,x:r,y:a})}}}}()},function(t,e,n){"use strict";var r=n(24),o=n(35),i=n(36),a=n(141),s=n(143);r({target:"Array",proto:!0,arity:1,forced:n(3)((function(){return 4294967297!==[].push.call({length:4294967296},1)}))||!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(t){return t instanceof TypeError}}()},{push:function(t){var e=o(this),n=i(e),r=arguments.length;s(n+r);for(var c=0;c79&&a<83||!i("reduce")},{reduce:function(t){var e=arguments.length;return o(this,t,e,e>1?arguments[1]:void 0)}})},function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},function(t,e,n){"use strict";var r=n(25),o=n(6),i=n(50),a=n(103),s=n(105),c=n(32),u=TypeError,l=c("toPrimitive");t.exports=function(t,e){if(!o(t)||i(t))return t;var n,c=a(t,l);if(c){if(void 0===e&&(e="default"),n=r(c,t,e),!o(n)||i(n))return n;throw new u("Can't convert object to primitive value")}return void 0===e&&(e="number"),s(t,e)}},function(t,e,n){"use strict";t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},function(t,e,n){"use strict";var r=n(31),o=n(48);t.exports=function(t,e){var n=t[e];return o(n)?void 0:r(n)}},function(t,e,n){"use strict";var r=String;t.exports=function(t){try{return r(t)}catch(t){return"Object"}}},function(t,e,n){"use strict";var r=n(25),o=n(1),i=n(6),a=TypeError;t.exports=function(t,e){var n,s;if("string"===e&&o(n=t.toString)&&!i(s=r(n,t)))return s;if(o(n=t.valueOf)&&!i(s=r(n,t)))return s;if("string"!==e&&o(n=t.toString)&&!i(s=r(n,t)))return s;throw new a("Can't convert object to primitive value")}},function(t,e,n){"use strict";var r=n(0),o=n(6),i=r.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},function(t,e,n){"use strict";var r=n(5),o=n(3);t.exports=r&&o((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},function(t,e,n){"use strict";var r=n(5),o=n(9),i=Function.prototype,a=r&&Object.getOwnPropertyDescriptor,s=o(i,"name"),c=s&&"something"===function(){}.name,u=s&&(!r||r&&a(i,"name").configurable);t.exports={EXISTS:s,PROPER:c,CONFIGURABLE:u}},function(t,e,n){"use strict";var r=n(2),o=n(1),i=n(33),a=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(t){return a(t)}),t.exports=i.inspectSource},function(t,e,n){"use strict";var r,o,i,a=n(111),s=n(0),c=n(6),u=n(13),l=n(9),f=n(33),p=n(112),d=n(60),h=s.TypeError,v=s.WeakMap;if(a||f.state){var m=f.state||(f.state=new v);m.get=m.get,m.has=m.has,m.set=m.set,r=function(t,e){if(m.has(t))throw new h("Object already initialized");return e.facade=t,m.set(t,e),e},o=function(t){return m.get(t)||{}},i=function(t){return m.has(t)}}else{var g=p("state");d[g]=!0,r=function(t,e){if(l(t,g))throw new h("Object already initialized");return e.facade=t,u(t,g,e),e},o=function(t){return l(t,g)?t[g]:{}},i=function(t){return l(t,g)}}t.exports={set:r,get:o,has:i,enforce:function(t){return i(t)?o(t):r(t,{})},getterFor:function(t){return function(e){var n;if(!c(e)||(n=o(e)).type!==t)throw new h("Incompatible receiver, "+t+" required");return n}}}},function(t,e,n){"use strict";var r=n(0),o=n(1),i=r.WeakMap;t.exports=o(i)&&/native code/.test(String(i))},function(t,e,n){"use strict";var r=n(55),o=n(57),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},function(t,e,n){"use strict";var r=n(30),o=n(2),i=n(114),a=n(121),s=n(59),c=o([].concat);t.exports=r("Reflect","ownKeys")||function(t){var e=i.f(s(t)),n=a.f;return n?c(e,n(t)):e}},function(t,e,n){"use strict";var r=n(115),o=n(120).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e,n){"use strict";var r=n(2),o=n(9),i=n(28),a=n(116).indexOf,s=n(60),c=r([].push);t.exports=function(t,e){var n,r=i(t),u=0,l=[];for(n in r)!o(s,n)&&o(r,n)&&c(l,n);for(;e.length>u;)o(r,n=e[u++])&&(~a(l,n)||c(l,n));return l}},function(t,e,n){"use strict";var r=n(28),o=n(117),i=n(36),a=function(t){return function(e,n,a){var s=r(e),c=i(s);if(0===c)return!t&&-1;var u,l=o(a,c);if(t&&n!=n){for(;c>l;)if((u=s[l++])!=u)return!0}else for(;c>l;l++)if((t||l in s)&&s[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},function(t,e,n){"use strict";var r=n(62),o=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?o(n+e,0):i(n,e)}},function(t,e,n){"use strict";var r=Math.ceil,o=Math.floor;t.exports=Math.trunc||function(t){var e=+t;return(e>0?o:r)(e)}},function(t,e,n){"use strict";var r=n(62),o=Math.min;t.exports=function(t){var e=r(t);return e>0?o(e,9007199254740991):0}},function(t,e,n){"use strict";t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,e,n){"use strict";e.f=Object.getOwnPropertySymbols},function(t,e,n){"use strict";var r=n(3),o=n(1),i=/#|\.prototype\./,a=function(t,e){var n=c[s(t)];return n===l||n!==u&&(o(e)?r(e):!!e)},s=a.normalize=function(t){return String(t).replace(i,".").toLowerCase()},c=a.data={},u=a.NATIVE="N",l=a.POLYFILL="P";t.exports=a},function(t,e,n){"use strict";var r=n(31),o=n(35),i=n(47),a=n(36),s=TypeError,c="Reduce of empty array with no initial value",u=function(t){return function(e,n,u,l){var f=o(e),p=i(f),d=a(f);if(r(n),0===d&&u<2)throw new s(c);var h=t?d-1:0,v=t?-1:1;if(u<2)for(;;){if(h in p){l=p[h],h+=v;break}if(h+=v,t?h<0:d<=h)throw new s(c)}for(;t?h>=0:d>h;h+=v)h in p&&(l=n(l,p[h],h,f));return l}};t.exports={left:u(!1),right:u(!0)}},function(t,e,n){"use strict";var r=n(3);t.exports=function(t,e){var n=[][t];return!!n&&r((function(){n.call(null,e||function(){return 1},1)}))}},function(t,e,n){"use strict";var r=n(0),o=n(16);t.exports="process"===o(r.process)},function(t,e,n){"use strict";var r=n(24),o=n(0),i=n(127),a=n(128),s=o.WebAssembly,c=7!==new Error("e",{cause:7}).cause,u=function(t,e){var n={};n[t]=a(t,e,c),r({global:!0,constructor:!0,arity:1,forced:c},n)},l=function(t,e){if(s&&s[t]){var n={};n[t]=a("WebAssembly."+t,e,c),r({target:"WebAssembly",stat:!0,constructor:!0,arity:1,forced:c},n)}};u("Error",(function(t){return function(e){return i(t,this,arguments)}})),u("EvalError",(function(t){return function(e){return i(t,this,arguments)}})),u("RangeError",(function(t){return function(e){return i(t,this,arguments)}})),u("ReferenceError",(function(t){return function(e){return i(t,this,arguments)}})),u("SyntaxError",(function(t){return function(e){return i(t,this,arguments)}})),u("TypeError",(function(t){return function(e){return i(t,this,arguments)}})),u("URIError",(function(t){return function(e){return i(t,this,arguments)}})),l("CompileError",(function(t){return function(e){return i(t,this,arguments)}})),l("LinkError",(function(t){return function(e){return i(t,this,arguments)}})),l("RuntimeError",(function(t){return function(e){return i(t,this,arguments)}}))},function(t,e,n){"use strict";var r=n(26),o=Function.prototype,i=o.apply,a=o.call;t.exports="object"==typeof Reflect&&Reflect.apply||(r?a.bind(i):function(){return a.apply(i,arguments)})},function(t,e,n){"use strict";var r=n(30),o=n(9),i=n(13),a=n(51),s=n(63),c=n(61),u=n(132),l=n(133),f=n(134),p=n(137),d=n(138),h=n(5),v=n(56);t.exports=function(t,e,n,m){var g=m?2:1,y=t.split("."),b=y[y.length-1],_=r.apply(null,y);if(_){var w=_.prototype;if(!v&&o(w,"cause")&&delete w.cause,!n)return _;var x=r("Error"),O=e((function(t,e){var n=f(m?e:t,void 0),r=m?new _(t):new _;return void 0!==n&&i(r,"message",n),d(r,O,r.stack,2),this&&a(w,this)&&l(r,this,O),arguments.length>g&&p(r,arguments[g]),r}));if(O.prototype=w,"Error"!==b?s?s(O,x):c(O,x,{name:!0}):h&&"stackTraceLimit"in _&&(u(O,_,"stackTraceLimit"),u(O,_,"prepareStackTrace")),c(O,_),!v)try{w.name!==b&&i(w,"name",b),w.constructor=O}catch(t){}return O}}},function(t,e,n){"use strict";var r=n(2),o=n(31);t.exports=function(t,e,n){try{return r(o(Object.getOwnPropertyDescriptor(t,e)[n]))}catch(t){}}},function(t,e,n){"use strict";var r=n(131),o=String,i=TypeError;t.exports=function(t){if(r(t))return t;throw new i("Can't set "+o(t)+" as a prototype")}},function(t,e,n){"use strict";var r=n(6);t.exports=function(t){return r(t)||null===t}},function(t,e,n){"use strict";var r=n(15).f;t.exports=function(t,e,n){n in t||r(t,n,{configurable:!0,get:function(){return e[n]},set:function(t){e[n]=t}})}},function(t,e,n){"use strict";var r=n(1),o=n(6),i=n(63);t.exports=function(t,e,n){var a,s;return i&&r(a=e.constructor)&&a!==n&&o(s=a.prototype)&&s!==n.prototype&&i(t,s),t}},function(t,e,n){"use strict";var r=n(95);t.exports=function(t,e){return void 0===t?arguments.length<2?"":e:r(t)}},function(t,e,n){"use strict";var r=n(136),o=n(1),i=n(16),a=n(32)("toStringTag"),s=Object,c="Arguments"===i(function(){return arguments}());t.exports=r?i:function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=s(t),a))?n:c?i(e):"Object"===(r=i(e))&&o(e.callee)?"Arguments":r}},function(t,e,n){"use strict";var r={};r[n(32)("toStringTag")]="z",t.exports="[object z]"===String(r)},function(t,e,n){"use strict";var r=n(6),o=n(13);t.exports=function(t,e){r(e)&&"cause"in e&&o(t,"cause",e.cause)}},function(t,e,n){"use strict";var r=n(13),o=n(139),i=n(140),a=Error.captureStackTrace;t.exports=function(t,e,n,s){i&&(a?a(t,e):r(t,"stack",o(n,s)))}},function(t,e,n){"use strict";var r=n(2),o=Error,i=r("".replace),a=String(new o("zxcasd").stack),s=/\n\s*at [^:]*:[^\n]*/,c=s.test(a);t.exports=function(t,e){if(c&&"string"==typeof t&&!o.prepareStackTrace)for(;e--;)t=i(t,s,"");return t}},function(t,e,n){"use strict";var r=n(3),o=n(27);t.exports=!r((function(){var t=new Error("a");return!("stack"in t)||(Object.defineProperty(t,"stack",o(1,7)),7!==t.stack)}))},function(t,e,n){"use strict";var r=n(5),o=n(142),i=TypeError,a=Object.getOwnPropertyDescriptor,s=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=s?function(t,e){if(o(t)&&!a(t,"length").writable)throw new i("Cannot set read only .length");return t.length=e}:function(t,e){return t.length=e}},function(t,e,n){"use strict";var r=n(16);t.exports=Array.isArray||function(t){return"Array"===r(t)}},function(t,e,n){"use strict";var r=TypeError;t.exports=function(t){if(t>9007199254740991)throw r("Maximum allowed index exceeded");return t}},function(t,e,n){var r=n(64),o=n(145);t.exports=function t(e,n,i,a,s){var c=-1,u=e.length;for(i||(i=o),s||(s=[]);++c0&&i(l)?n>1?t(l,n-1,i,a,s):r(s,l):a||(s[s.length]=l)}return s}},function(t,e,n){var r=n(14),o=n(37),i=n(4),a=r?r.isConcatSpreadable:void 0;t.exports=function(t){return i(t)||o(t)||!!(a&&t&&t[a])}},function(t,e,n){var r=n(12),o=n(11);t.exports=function(t){return o(t)&&"[object Arguments]"==r(t)}},function(t,e,n){var r=n(14),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,s=r?r.toStringTag:void 0;t.exports=function(t){var e=i.call(t,s),n=t[s];try{t[s]=void 0;var r=!0}catch(t){}var o=a.call(t);return r&&(e?t[s]=n:delete t[s]),o}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var r=n(150),o=n(206),i=n(45),a=n(4),s=n(216);t.exports=function(t){return"function"==typeof t?t:null==t?i:"object"==typeof t?a(t)?o(t[0],t[1]):r(t):s(t)}},function(t,e,n){var r=n(151),o=n(205),i=n(82);t.exports=function(t){var e=o(t);return 1==e.length&&e[0][2]?i(e[0][0],e[0][1]):function(n){return n===t||r(n,t,e)}}},function(t,e,n){var r=n(66),o=n(70);t.exports=function(t,e,n,i){var a=n.length,s=a,c=!i;if(null==t)return!s;for(t=Object(t);a--;){var u=n[a];if(c&&u[2]?u[1]!==t[u[0]]:!(u[0]in t))return!1}for(;++a-1}},function(t,e,n){var r=n(18);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},function(t,e,n){var r=n(17);t.exports=function(){this.__data__=new r,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(17),o=n(38),i=n(40);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new i(a)}return n.set(t,e),this.size=n.size,this}},function(t,e,n){var r=n(68),o=n(163),i=n(39),a=n(69),s=/^\[object .+?Constructor\]$/,c=Function.prototype,u=Object.prototype,l=c.toString,f=u.hasOwnProperty,p=RegExp("^"+l.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?p:s).test(a(t))}},function(t,e,n){var r,o=n(164),i=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!i&&i in t}},function(t,e,n){var r=n(7)["__core-js_shared__"];t.exports=r},function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},function(t,e,n){var r=n(167),o=n(17),i=n(38);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(i||o),string:new r}}},function(t,e,n){var r=n(168),o=n(169),i=n(170),a=n(171),s=n(172);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},function(t,e,n){var r=n(72),o=n(228),i=n(233),a=n(73),s=n(234),c=n(41);t.exports=function(t,e,n){var u=-1,l=o,f=t.length,p=!0,d=[],h=d;if(n)p=!1,l=i;else if(f>=200){var v=e?null:s(t);if(v)return c(v);p=!1,l=a,h=new r}else h=e?[]:d;t:for(;++u-1}},function(t,e,n){var r=n(230),o=n(231),i=n(232);t.exports=function(t,e,n){return e==e?i(t,e,n):r(t,o,n)}},function(t,e){t.exports=function(t,e,n,r){for(var o=t.length,i=n+(r?1:-1);r?i--:++i=0&&Math.floor(e)===e&&isFinite(t)}function v(t){return a(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function m(t){return null==t?"":Array.isArray(t)||p(t)&&t.toString===f?JSON.stringify(t,g,2):String(t)}function g(t,e){return e&&e.__v_isRef?e.value:e}function y(t){var e=parseFloat(t);return isNaN(e)?t:e}function b(t,e){for(var n=Object.create(null),r=t.split(","),o=0;o-1)return t.splice(r,1)}}var x=Object.prototype.hasOwnProperty;function O(t,e){return x.call(t,e)}function S(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var C=/-(\w)/g,$=S((function(t){return t.replace(C,(function(t,e){return e?e.toUpperCase():""}))})),k=S((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),E=/\B([A-Z])/g,j=S((function(t){return t.replace(E,"-$1").toLowerCase()}));var T=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function A(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function P(t,e){for(var n in e)t[n]=e[n];return t}function L(t){for(var e={},n=0;n0,Q=G&&G.indexOf("edge/")>0;G&&G.indexOf("android");var tt=G&&/iphone|ipad|ipod|ios/.test(G);G&&/chrome\/\d+/.test(G),G&&/phantomjs/.test(G);var et,nt=G&&G.match(/firefox\/(\d+)/),rt={}.watch,ot=!1;if(X)try{var it={};Object.defineProperty(it,"passive",{get:function(){ot=!0}}),window.addEventListener("test-passive",null,it)}catch(t){}var at=function(){return void 0===et&&(et=!X&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),et},st=X&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ct(t){return"function"==typeof t&&/native code/.test(t.toString())}var ut,lt="undefined"!=typeof Symbol&&ct(Symbol)&&"undefined"!=typeof Reflect&&ct(Reflect.ownKeys);ut="undefined"!=typeof Set&&ct(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ft=null;function pt(t){void 0===t&&(t=null),t||ft&&ft._scope.off(),ft=t,t&&t._scope.on()}var dt=function(){function t(t,e,n,r,o,i,a,s){this.tag=t,this.data=e,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),ht=function(t){void 0===t&&(t="");var e=new dt;return e.text=t,e.isComment=!0,e};function vt(t){return new dt(void 0,void 0,void 0,String(t))}function mt(t){var e=new dt(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}"function"==typeof SuppressedError&&SuppressedError;var gt=0,yt=[],bt=function(){function t(){this._pending=!1,this.id=gt++,this.subs=[]}return t.prototype.addSub=function(t){this.subs.push(t)},t.prototype.removeSub=function(t){this.subs[this.subs.indexOf(t)]=null,this._pending||(this._pending=!0,yt.push(this))},t.prototype.depend=function(e){t.target&&t.target.addDep(this)},t.prototype.notify=function(t){var e=this.subs.filter((function(t){return t}));for(var n=0,r=e.length;n0&&(Gt((u=t(u,"".concat(n||"","_").concat(r)))[0])&&Gt(f)&&(p[l]=vt(f.text+u[0].text),u.shift()),p.push.apply(p,u)):c(u)?Gt(f)?p[l]=vt(f.text+u):""!==u&&p.push(vt(u)):Gt(u)&&Gt(f)?p[l]=vt(f.text+u.text):(s(e._isVList)&&a(u.tag)&&i(u.key)&&a(n)&&(u.key="__vlist".concat(n,"_").concat(r,"__")),p.push(u)));return p}(t):void 0}function Gt(t){return a(t)&&a(t.text)&&!1===t.isComment}function Jt(t,e){var n,r,i,s,c=null;if(o(t)||"string"==typeof t)for(c=new Array(t.length),n=0,r=t.length;n0,s=e?!!e.$stable:!a,c=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(s&&o&&o!==r&&c===o.$key&&!a&&!o.$hasNormal)return o;for(var u in i={},e)e[u]&&"$"!==u[0]&&(i[u]=me(t,n,u,e[u]))}else i={};for(var l in n)l in i||(i[l]=ge(n,l));return e&&Object.isExtensible(e)&&(e._normalized=i),W(i,"$stable",s),W(i,"$key",c),W(i,"$hasNormal",a),i}function me(t,e,n,r){var i=function(){var e=ft;pt(t);var n=arguments.length?r.apply(null,arguments):r({}),i=(n=n&&"object"==typeof n&&!o(n)?[n]:Xt(n))&&n[0];return pt(e),n&&(!i||1===n.length&&i.isComment&&!he(i))?void 0:n};return r.proxy&&Object.defineProperty(e,n,{get:i,enumerable:!0,configurable:!0}),i}function ge(t,e){return function(){return t[e]}}function ye(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy={};W(e,"_v_attr_proxy",!0),be(e,t.$attrs,r,t,"$attrs")}return t._attrsProxy},get listeners(){t._listenersProxy||be(t._listenersProxy={},t.$listeners,r,t,"$listeners");return t._listenersProxy},get slots(){return function(t){t._slotsProxy||we(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(t)},emit:T(t.$emit,t),expose:function(e){e&&Object.keys(e).forEach((function(n){return Ut(t,e,n)}))}}}function be(t,e,n,r,o){var i=!1;for(var a in e)a in t?e[a]!==n[a]&&(i=!0):(i=!0,_e(t,a,r,o));for(var a in t)a in e||(i=!0,delete t[a]);return i}function _e(t,e,n,r){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[r][e]}})}function we(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}var xe=null;function Oe(t,e){return(t.__esModule||lt&&"Module"===t[Symbol.toStringTag])&&(t=t.default),l(t)?e.extend(t):t}function Se(t){if(o(t))for(var e=0;edocument.createEvent("Event").timeStamp&&(un=function(){return ln.now()})}var fn=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function pn(){var t,e;for(cn=un(),an=!0,en.sort(fn),sn=0;snsn&&en[n].id>t.id;)n--;en.splice(n+1,0,t)}else en.push(t);on||(on=!0,De(pn))}}function hn(t,e){if(t){for(var n=Object.create(null),r=lt?Reflect.ownKeys(t):Object.keys(t),o=0;o-1)if(i&&!O(o,"default"))a=!1;else if(""===a||a===j(t)){var c=Mn(String,o.type);(c<0||s-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!d(t)&&t.test(e)}function Jn(t,e){var n=t.cache,r=t.keys,o=t._vnode,i=t.$vnode;for(var a in n){var s=n[a];if(s){var c=s.name;c&&!e(c)&&Zn(n,a,r,o)}}i.componentOptions.children=void 0}function Zn(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,w(n,e)}Kn.prototype._init=function(t){var e=this;e._uid=qn++,e._isVue=!0,e.__v_skip=!0,e._scope=new Bt(!0),e._scope.parent=void 0,e._scope._vm=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Tn(Wn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Xe(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=pe(e._renderChildren,o),t.$scopedSlots=n?ve(t.$parent,n.data.scopedSlots,t.$slots):r,t._c=function(e,n,r,o){return Ce(t,e,n,r,o,!1)},t.$createElement=function(e,n,r,o){return Ce(t,e,n,r,o,!0)};var i=n&&n.data;Pt(t,"$attrs",i&&i.attrs||r,null,!0),Pt(t,"$listeners",e._parentListeners||r,null,!0)}(e),tn(e,"beforeCreate",void 0,!1),function(t){var e=hn(t.$options.inject,t);e&&(Et(!1),Object.keys(e).forEach((function(n){Pt(t,n,e[n])})),Et(!0))}(e),Dn(e),function(t){var e=t.$options.provide;if(e){var n=u(e)?e.call(t):e;if(!l(n))return;for(var r=Ft(t),o=lt?Reflect.ownKeys(n):Object.keys(n),i=0;i1?A(n):n;for(var r=A(arguments,1),o='event handler for "'.concat(t,'"'),i=0,a=n.length;iparseInt(this.max)&&Zn(t,e[0],e,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Zn(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Jn(t,(function(t){return Gn(e,t)}))})),this.$watch("exclude",(function(e){Jn(t,(function(t){return!Gn(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Se(t),n=e&&e.componentOptions;if(n){var r=Xn(n),o=this.include,i=this.exclude;if(o&&(!r||!Gn(o,r))||i&&r&&Gn(i,r))return e;var a=this.cache,s=this.keys,c=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;a[c]?(e.componentInstance=a[c].componentInstance,w(s,c),s.push(c)):(this.vnodeToCache=e,this.keyToCache=c),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={get:function(){return F}};Object.defineProperty(t,"config",e),t.util={warn:On,extend:P,mergeOptions:Tn,defineReactive:Pt},t.set=Lt,t.delete=zt,t.nextTick=De,t.observable=function(t){return At(t),t},t.options=Object.create(null),H.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,P(t.options.components,tr),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=A(arguments,1);return n.unshift(this),u(t.install)?t.install.apply(t,n):u(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Tn(this.options,t),this}}(t),Yn(t),function(t){H.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&p(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&u(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(Kn),Object.defineProperty(Kn.prototype,"$isServer",{get:at}),Object.defineProperty(Kn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Kn,"FunctionalRenderContext",{value:vn}),Kn.version="2.7.16";var er=b("style,class"),nr=b("input,textarea,option,select,progress"),rr=b("contenteditable,draggable,spellcheck"),or=b("events,caret,typing,plaintext-only"),ir=b("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),ar="http://www.w3.org/1999/xlink",sr=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},cr=function(t){return sr(t)?t.slice(6,t.length):""},ur=function(t){return null==t||!1===t};function lr(t){for(var e=t.data,n=t,r=t;a(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(e=fr(r.data,e));for(;a(n=n.parent);)n&&n.data&&(e=fr(e,n.data));return function(t,e){if(a(t)||a(e))return pr(t,dr(e));return""}(e.staticClass,e.class)}function fr(t,e){return{staticClass:pr(t.staticClass,e.staticClass),class:a(t.class)?[t.class,e.class]:e.class}}function pr(t,e){return t?e?t+" "+e:t:e||""}function dr(t){return Array.isArray(t)?function(t){for(var e,n="",r=0,o=t.length;r-1?Ir(t,e,n):ir(e)?ur(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):rr(e)?t.setAttribute(e,function(t,e){return ur(e)||"false"===e?"false":"contenteditable"===t&&or(e)?e:"true"}(e,n)):sr(e)?ur(n)?t.removeAttributeNS(ar,cr(e)):t.setAttributeNS(ar,e,n):Ir(t,e,n)}function Ir(t,e,n){if(ur(n))t.removeAttribute(e);else{if(J&&!Z&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var Nr={create:Rr,update:Rr};function Dr(t,e){var n=e.elm,r=e.data,o=t.data;if(!(i(r.staticClass)&&i(r.class)&&(i(o)||i(o.staticClass)&&i(o.class)))){var s=lr(e),c=n._transitionClasses;a(c)&&(s=pr(s,dr(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Ur,Hr={create:Dr,update:Dr};function Br(t,e,n){var r=Ur;return function o(){var i=e.apply(null,arguments);null!==i&&qr(t,o,n,r)}}var Fr=Ae&&!(nt&&Number(nt[1])<=53);function Vr(t,e,n,r){if(Fr){var o=cn,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}Ur.addEventListener(t,e,ot?{capture:n,passive:r}:n)}function qr(t,e,n,r){(r||Ur).removeEventListener(t,e._wrapper||e,n)}function Wr(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};Ur=e.elm||t.elm,function(t){if(a(t.__r)){var e=J?"change":"input";t[e]=[].concat(t.__r,t[e]||[]),delete t.__r}a(t.__c)&&(t.change=[].concat(t.__c,t.change||[]),delete t.__c)}(n),Wt(n,r,Vr,qr,Br,e.context),Ur=void 0}}var Kr,Yr={create:Wr,update:Wr,destroy:function(t){return Wr(t,Sr)}};function Xr(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var n,r,o=e.elm,c=t.data.domProps||{},u=e.data.domProps||{};for(n in(a(u.__ob__)||s(u._v_attr_proxy))&&(u=e.data.domProps=P({},u)),c)n in u||(o[n]="");for(n in u){if(r=u[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),r===c[n])continue;1===o.childNodes.length&&o.removeChild(o.childNodes[0])}if("value"===n&&"PROGRESS"!==o.tagName){o._value=r;var l=i(r)?"":String(r);Gr(o,l)&&(o.value=l)}else if("innerHTML"===n&&mr(o.tagName)&&i(o.innerHTML)){(Kr=Kr||document.createElement("div")).innerHTML="".concat(r,"");for(var f=Kr.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;f.firstChild;)o.appendChild(f.firstChild)}else if(r!==c[n])try{o[n]=r}catch(t){}}}}function Gr(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,r=t._vModifiers;if(a(r)){if(r.number)return y(n)!==y(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Jr={create:Xr,update:Xr},Zr=S((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function Qr(t){var e=to(t.style);return t.staticStyle?P(t.staticStyle,e):e}function to(t){return Array.isArray(t)?L(t):"string"==typeof t?Zr(t):t}var eo,no=/^--/,ro=/\s*!important$/,oo=function(t,e,n){if(no.test(e))t.style.setProperty(e,n);else if(ro.test(n))t.style.setProperty(j(e),n.replace(ro,""),"important");else{var r=ao(e);if(Array.isArray(n))for(var o=0,i=n.length;o-1?e.split(uo).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function fo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(uo).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function po(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&P(e,ho(t.name||"v")),P(e,t),e}return"string"==typeof t?ho(t):void 0}}var ho=S((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),vo=X&&!Z,mo="transition",go="transitionend",yo="animation",bo="animationend";vo&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(mo="WebkitTransition",go="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(yo="WebkitAnimation",bo="webkitAnimationEnd"));var _o=X?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function wo(t){_o((function(){_o(t)}))}function xo(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),lo(t,e))}function Oo(t,e){t._transitionClasses&&w(t._transitionClasses,e),fo(t,e)}function So(t,e,n){var r=$o(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s="transition"===o?go:bo,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout((function(){c0&&(n="transition",l=a,f=i.length):"animation"===e?u>0&&(n="animation",l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?"transition":"animation":null)?"transition"===n?i.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:"transition"===n&&Co.test(r[mo+"Property"])}}function ko(t,e){for(;t.length1}function Lo(t,e){!0!==e.data.show&&jo(e)}var zo=function(t){var e,n,r={},u=t.modules,l=t.nodeOps;for(e=0;eh?_(t,i(n[g+1])?null:n[g+1].elm,n,d,g,r):d>g&&x(e,f,h)}(f,v,g,n,u):a(g)?(a(t.text)&&l.setTextContent(f,""),_(f,null,g,0,g.length-1,n)):a(v)?x(v,0,v.length-1):a(t.text)&&l.setTextContent(f,""):t.text!==e.text&&l.setTextContent(f,e.text),a(h)&&a(d=h.hook)&&a(d=d.postpatch)&&d(t,e)}}}function $(t,e,n){if(s(n)&&a(t.parent))t.parent.data.pendingInsert=e;else for(var r=0;r-1,a.selected!==i&&(a.selected=i);else if(I(Do(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function No(t,e){return e.every((function(e){return!I(e,t)}))}function Do(t){return"_value"in t?t._value:t.value}function Uo(t){t.target.composing=!0}function Ho(t){t.target.composing&&(t.target.composing=!1,Bo(t.target,"input"))}function Bo(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Fo(t){return!t.componentInstance||t.data&&t.data.transition?t:Fo(t.componentInstance._vnode)}var Vo={model:Ro,show:{bind:function(t,e,n){var r=e.value,o=(n=Fo(n)).data&&n.data.transition,i=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&o?(n.data.show=!0,jo(n,(function(){t.style.display=i}))):t.style.display=r?i:"none"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=Fo(n)).data&&n.data.transition?(n.data.show=!0,r?jo(n,(function(){t.style.display=t.__vOriginalDisplay})):To(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}}},qo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Wo(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?Wo(Se(e.children)):t}function Ko(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var r in o)e[$(r)]=o[r];return e}function Yo(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var Xo=function(t){return t.tag||he(t)},Go=function(t){return"show"===t.name},Jo={name:"transition",props:qo,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(Xo)).length){0;var r=this.mode;0;var o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var i=Wo(o);if(!i)return o;if(this._leaving)return Yo(t,o);var a="__transition-".concat(this._uid,"-");i.key=null==i.key?i.isComment?a+"comment":a+i.tag:c(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s=(i.data||(i.data={})).transition=Ko(this),u=this._vnode,l=Wo(u);if(i.data.directives&&i.data.directives.some(Go)&&(i.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(i,l)&&!he(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=P({},s);if("out-in"===r)return this._leaving=!0,Kt(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),Yo(t,o);if("in-out"===r){if(he(i))return u;var p,d=function(){p()};Kt(s,"afterEnter",d),Kt(s,"enterCancelled",d),Kt(f,"delayLeave",(function(t){p=t}))}}return o}}},Zo=P({tag:String,moveClass:String},qo);function Qo(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function ti(t){t.data.newPos=t.elm.getBoundingClientRect()}function ei(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform="translate(".concat(r,"px,").concat(o,"px)"),i.transitionDuration="0s"}}delete Zo.mode;var ni={Transition:Jo,TransitionGroup:{props:Zo,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=Je(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=Ko(this),s=0;s-1?yr[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:yr[t]=/HTMLUnknownElement/.test(e.toString())},P(Kn.options.directives,Vo),P(Kn.options.components,ni),Kn.prototype.__patch__=X?zo:z,Kn.prototype.$mount=function(t,e){return function(t,e,n){var r;t.$el=e,t.$options.render||(t.$options.render=ht),tn(t,"beforeMount"),r=function(){t._update(t._render(),n)},new qe(t,r,z,{before:function(){t._isMounted&&!t._isDestroyed&&tn(t,"beforeUpdate")}},!0),n=!1;var o=t._preWatchers;if(o)for(var i=0;i=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}(o.path||""),u=e&&e.path||"/",l=c.path?Oi(c.path,u,n||o.append):u,f=function(t,e,n){void 0===e&&(e={});var r,o=n||li;try{r=o(t||"")}catch(t){r={}}for(var i in e){var a=e[i];r[i]=Array.isArray(a)?a.map(ui):ui(a)}return r}(c.query,o.query,r&&r.options.parseQuery),p=o.hash||c.hash;return p&&"#"!==p.charAt(0)&&(p="#"+p),{_normalized:!0,path:l,query:f,hash:p}}var Vi,qi=function(){},Wi={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),i=o.location,a=o.route,s=o.href,c={},u=n.options.linkActiveClass,l=n.options.linkExactActiveClass,f=null==u?"router-link-active":u,p=null==l?"router-link-exact-active":l,d=null==this.activeClass?f:this.activeClass,h=null==this.exactActiveClass?p:this.exactActiveClass,v=a.redirectedFrom?di(null,Fi(a.redirectedFrom),null,n):a;c[h]=yi(r,v,this.exactPath),c[d]=this.exact||this.exactPath?c[h]:function(t,e){return 0===t.path.replace(pi,"/").indexOf(e.path.replace(pi,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(r,v);var m=c[h]?this.ariaCurrentValue:null,g=function(t){Ki(t)&&(e.replace?n.replace(i,qi):n.push(i,qi))},y={click:Ki};Array.isArray(this.event)?this.event.forEach((function(t){y[t]=g})):y[this.event]=g;var b={class:c},_=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:s,route:a,navigate:g,isActive:c[d],isExactActive:c[h]});if(_){if(1===_.length)return _[0];if(_.length>1||!_.length)return 0===_.length?t():t("span",{},_)}if("a"===this.tag)b.on=y,b.attrs={href:s,"aria-current":m};else{var w=function t(e){var n;if(e)for(var r=0;r-1&&(s.params[p]=n.params[p]);return s.path=Bi(l.path,s.params),c(l,s,a)}if(s.path){s.params={};for(var d=0;d-1}function Sa(t,e){return Oa(t)&&t._isRouter&&(null==e||t.type===e)}function Ca(t,e,n){var r=function(o){o>=t.length?n():t[o]?e(t[o],(function(){r(o+1)})):r(o+1)};r(0)}function $a(t){return function(e,n,r){var o=!1,i=0,a=null;ka(t,(function(t,e,n,s){if("function"==typeof t&&void 0===t.cid){o=!0,i++;var c,u=Ta((function(e){var o;((o=e).__esModule||ja&&"Module"===o[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:Vi.extend(e),n.components[s]=e,--i<=0&&r()})),l=Ta((function(t){var e="Failed to resolve async component "+s+": "+t;a||(a=Oa(t)?t:new Error(e),r(a))}));try{c=t(u,l)}catch(t){l(t)}if(c)if("function"==typeof c.then)c.then(u,l);else{var f=c.component;f&&"function"==typeof f.then&&f.then(u,l)}}})),o||r()}}function ka(t,e){return Ea(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function Ea(t){return Array.prototype.concat.apply([],t)}var ja="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Ta(t){var e=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!e)return e=!0,t.apply(this,n)}}var Aa=function(t,e){this.router=t,this.base=function(t){if(!t)if(Yi){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=vi,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Pa(t,e,n,r){var o=ka(t,(function(t,r,o,i){var a=function(t,e){"function"!=typeof t&&(t=Vi.extend(t));return t.options[e]}(t,e);if(a)return Array.isArray(a)?a.map((function(t){return n(t,r,o,i)})):n(a,r,o,i)}));return Ea(r?o.reverse():o)}function La(t,e){if(e)return function(){return t.apply(e,arguments)}}Aa.prototype.listen=function(t){this.cb=t},Aa.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Aa.prototype.onError=function(t){this.errorCbs.push(t)},Aa.prototype.transitionTo=function(t,e,n){var r,o=this;try{r=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var i=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),e&&e(r),o.ensureURL(),o.router.afterHooks.forEach((function(t){t&&t(r,i)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(t){t(r)})))}),(function(t){n&&n(t),t&&!o.ready&&(Sa(t,ya.redirected)&&i===vi||(o.ready=!0,o.readyErrorCbs.forEach((function(e){e(t)}))))}))},Aa.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current;this.pending=t;var i,a,s=function(t){!Sa(t)&&Oa(t)&&(r.errorCbs.length?r.errorCbs.forEach((function(e){e(t)})):console.error(t)),n&&n(t)},c=t.matched.length-1,u=o.matched.length-1;if(yi(t,o)&&c===u&&t.matched[c]===o.matched[u])return this.ensureURL(),t.hash&&aa(this.router,o,t,!1),s(((a=wa(i=o,t,ya.duplicated,'Avoided redundant navigation to current location: "'+i.fullPath+'".')).name="NavigationDuplicated",a));var l=function(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,r=va&&n;r&&this.listeners.push(ia());var o=function(){var n=t.current,o=Ra(t.base);t.current===vi&&o===t._startLocation||t.transitionTo(o,(function(t){r&&aa(e,t,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){ma(Si(r.base+t.fullPath)),aa(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){ga(Si(r.base+t.fullPath)),aa(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(Ra(this.base)!==this.current.fullPath){var e=Si(this.base+this.current.fullPath);t?ma(e):ga(e)}},e.prototype.getCurrentLocation=function(){return Ra(this.base)},e}(Aa);function Ra(t){var e=window.location.pathname,n=e.toLowerCase(),r=t.toLowerCase();return!t||n!==r&&0!==n.indexOf(Si(r+"/"))||(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Ma=function(t){function e(e,n,r){t.call(this,e,n),r&&function(t){var e=Ra(t);if(!/^\/#/.test(e))return window.location.replace(Si(t+"/#"+e)),!0}(this.base)||Ia()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=va&&e;n&&this.listeners.push(ia());var r=function(){var e=t.current;Ia()&&t.transitionTo(Na(),(function(r){n&&aa(t.router,r,e,!0),va||Ha(r.fullPath)}))},o=va?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},e.prototype.push=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Ua(t.fullPath),aa(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this,o=this.current;this.transitionTo(t,(function(t){Ha(t.fullPath),aa(r.router,t,o,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Na()!==e&&(t?Ua(e):Ha(e))},e.prototype.getCurrentLocation=function(){return Na()},e}(Aa);function Ia(){var t=Na();return"/"===t.charAt(0)||(Ha("/"+t),!1)}function Na(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Da(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Ua(t){va?ma(Da(t)):window.location.hash=t}function Ha(t){va?ga(Da(t)):window.location.replace(Da(t))}var Ba=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,(function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var t=e.current;e.index=n,e.updateRoute(r),e.router.afterHooks.forEach((function(e){e&&e(r,t)}))}),(function(t){Sa(t,ya.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Aa),Fa=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Ji(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!va&&!1!==t.fallback,this.fallback&&(e="hash"),Yi||(e="abstract"),this.mode=e,e){case"history":this.history=new za(this,t.base);break;case"hash":this.history=new Ma(this,t.base,this.fallback);break;case"abstract":this.history=new Ba(this,t.base);break;default:0}},Va={currentRoute:{configurable:!0}};Fa.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},Va.currentRoute.get=function(){return this.history&&this.history.current},Fa.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof za||n instanceof Ma){var r=function(t){n.setupListeners(),function(t){var r=n.current,o=e.options.scrollBehavior;va&&o&&"fullPath"in t&&aa(e,t,r,!1)}(t)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Fa.prototype.beforeEach=function(t){return Wa(this.beforeHooks,t)},Fa.prototype.beforeResolve=function(t){return Wa(this.resolveHooks,t)},Fa.prototype.afterEach=function(t){return Wa(this.afterHooks,t)},Fa.prototype.onReady=function(t,e){this.history.onReady(t,e)},Fa.prototype.onError=function(t){this.history.onError(t)},Fa.prototype.push=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.push(t,e,n)}));this.history.push(t,e,n)},Fa.prototype.replace=function(t,e,n){var r=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){r.history.replace(t,e,n)}));this.history.replace(t,e,n)},Fa.prototype.go=function(t){this.history.go(t)},Fa.prototype.back=function(){this.go(-1)},Fa.prototype.forward=function(){this.go(1)},Fa.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Fa.prototype.resolve=function(t,e,n){var r=Fi(t,e=e||this.history.current,n,this),o=this.match(r,e),i=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(t,e,n){var r="hash"===n?"#"+e:e;return t?Si(t+"/"+r):r}(this.history.base,i,this.mode),normalizedTo:r,resolved:o}},Fa.prototype.getRoutes=function(){return this.matcher.getRoutes()},Fa.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==vi&&this.history.transitionTo(this.history.getCurrentLocation())},Fa.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==vi&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Fa.prototype,Va);var qa=Fa;function Wa(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Fa.install=function t(e){if(!t.installed||Vi!==e){t.installed=!0,Vi=e;var n=function(t){return void 0!==t},r=function(t,e){var r=t.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",wi),e.component("RouterLink",Wi);var o=e.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},Fa.version="3.6.5",Fa.isNavigationFailure=Sa,Fa.NavigationFailureType=ya,Fa.START_LOCATION=vi,Yi&&window.Vue&&window.Vue.use(Fa);n(99);n(126),n(92);var Ka={"components/AlgoliaSearchBox":()=>Promise.all([n.e(0),n.e(13)]).then(n.bind(null,313)),"components/DropdownLink":()=>Promise.all([n.e(0),n.e(14)]).then(n.bind(null,261)),"components/DropdownTransition":()=>Promise.all([n.e(0),n.e(19)]).then(n.bind(null,249)),"components/Home":()=>Promise.all([n.e(0),n.e(16)]).then(n.bind(null,287)),"components/NavLink":()=>n.e(23).then(n.bind(null,248)),"components/NavLinks":()=>Promise.all([n.e(0),n.e(12)]).then(n.bind(null,272)),"components/Navbar":()=>Promise.all([n.e(0),n.e(1)]).then(n.bind(null,310)),"components/Page":()=>Promise.all([n.e(0),n.e(11)]).then(n.bind(null,288)),"components/PageEdit":()=>Promise.all([n.e(0),n.e(17)]).then(n.bind(null,274)),"components/PageNav":()=>Promise.all([n.e(0),n.e(15)]).then(n.bind(null,275)),"components/Sidebar":()=>Promise.all([n.e(0),n.e(10)]).then(n.bind(null,289)),"components/SidebarButton":()=>Promise.all([n.e(0),n.e(20)]).then(n.bind(null,290)),"components/SidebarGroup":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,273)),"components/SidebarLink":()=>Promise.all([n.e(0),n.e(18)]).then(n.bind(null,262)),"components/SidebarLinks":()=>Promise.all([n.e(0),n.e(3)]).then(n.bind(null,260)),"global-components/Badge":()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,318)),"global-components/CodeBlock":()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,314)),"global-components/CodeGroup":()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,315)),"layouts/404":()=>n.e(7).then(n.bind(null,316)),"layouts/Layout":()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,317)),NotFound:()=>n.e(7).then(n.bind(null,316)),Layout:()=>Promise.all([n.e(0),n.e(1),n.e(2)]).then(n.bind(null,317))},Ya={"v-862b2260":()=>n.e(29).then(n.bind(null,319)),"v-3e0654b8":()=>n.e(30).then(n.bind(null,320)),"v-25a82b36":()=>n.e(31).then(n.bind(null,321)),"v-16284f9c":()=>n.e(21).then(n.bind(null,322)),"v-46e4a2a0":()=>n.e(25).then(n.bind(null,323)),"v-0d4a01b4":()=>n.e(24).then(n.bind(null,324)),"v-77a0f5a4":()=>n.e(26).then(n.bind(null,325)),"v-a85d48a8":()=>n.e(27).then(n.bind(null,326)),"v-d9199bac":()=>n.e(22).then(n.bind(null,327)),"v-7b1508a8":()=>n.e(28).then(n.bind(null,328)),"v-62fd777c":()=>n.e(32).then(n.bind(null,329))};function Xa(t){const e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}const Ga=/-(\w)/g,Ja=Xa(t=>t.replace(Ga,(t,e)=>e?e.toUpperCase():"")),Za=/\B([A-Z])/g,Qa=Xa(t=>t.replace(Za,"-$1").toLowerCase()),ts=Xa(t=>t.charAt(0).toUpperCase()+t.slice(1));function es(t,e){if(!e)return;if(t(e))return t(e);return e.includes("-")?t(ts(Ja(e))):t(ts(e))||t(Qa(e))}const ns=Object.assign({},Ka,Ya),rs=t=>ns[t],os=t=>Ya[t],is=t=>Ka[t],as=t=>Kn.component(t);function ss(t){return es(os,t)}function cs(t){return es(is,t)}function us(t){return es(rs,t)}function ls(t){return es(as,t)}function fs(...t){return Promise.all(t.filter(t=>t).map(async t=>{if(!ls(t)&&us(t)){const e=await us(t)();Kn.component(t,e.default)}}))}function ps(t,e){"undefined"!=typeof window&&window.__VUEPRESS__&&(window.__VUEPRESS__[t]=e)}var ds=n(89),hs=n.n(ds),vs=n(90),ms=n.n(vs),gs={created(){if(this.siteMeta=this.$site.headTags.filter(([t])=>"meta"===t).map(([t,e])=>e),this.$ssrContext){const e=this.getMergedMetaTags();this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.pageMeta=(t=e)?t.map(t=>{let e="{e+=` ${n}="${ms()(t[n])}"`}),e+">"}).join("\n "):"",this.$ssrContext.canonicalLink=bs(this.$canonicalUrl)}var t},mounted(){this.currentMetaTags=[...document.querySelectorAll("meta")],this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta(){document.title=this.$title,document.documentElement.lang=this.$lang;const t=this.getMergedMetaTags();this.currentMetaTags=_s(t,this.currentMetaTags)},getMergedMetaTags(){const t=this.$page.frontmatter.meta||[];return hs()([{name:"description",content:this.$description}],t,this.siteMeta,ws)},updateCanonicalLink(){ys(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",bs(this.$canonicalUrl))}},watch:{$page(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy(){_s(null,this.currentMetaTags),ys()}};function ys(){const t=document.querySelector("link[rel='canonical']");t&&t.remove()}function bs(t=""){return t?``:""}function _s(t,e){if(e&&[...e].filter(t=>t.parentNode===document.head).forEach(t=>document.head.removeChild(t)),t)return t.map(t=>{const e=document.createElement("meta");return Object.keys(t).forEach(n=>{e.setAttribute(n,t[n])}),document.head.appendChild(e),e})}function ws(t){for(const e of["name","property","itemprop"])if(t.hasOwnProperty(e))return t[e]+e;return JSON.stringify(t)}var xs=n(22),Os=n.n(xs),Ss={mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:Os()((function(){this.setActiveHash()}),300),setActiveHash(){const t=[].slice.call(document.querySelectorAll(".sidebar-link")),e=[].slice.call(document.querySelectorAll(".header-anchor")).filter(e=>t.some(t=>t.hash===e.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop),r=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),o=window.innerHeight+n;for(let t=0;t=i.parentElement.offsetTop+10&&(!a||n{this.$nextTick(()=>{this.$vuepress.$set("disableScrollBehavior",!1)})})}}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}},Cs=n(23),$s=n.n(Cs),ks={mounted(){$s.a.configure({showSpinner:!1}),this.$router.beforeEach((t,e,n)=>{t.path===e.path||Kn.component(t.name)||$s.a.start(),n()}),this.$router.afterEach(()=>{$s.a.done(),this.isSidebarOpen=!1})}},Es=(n(237),Object.assign||function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{},r=window.Promise||function(t){function e(){}t(e,e)},o=function(t){var e=t.target;e!==C?-1!==b.indexOf(e)&&v({target:e}):h()},i=function(){if(!w&&S.original){var t=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(x-t)>O.scrollOffset&&setTimeout(h,150)}},a=function(t){var e=t.key||t.keyCode;"Escape"!==e&&"Esc"!==e&&27!==e||h()},s=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t;if(t.background&&(C.style.background=t.background),t.container&&t.container instanceof Object&&(e.container=Es({},O.container,t.container)),t.template){var n=Ts(t.template)?t.template:document.querySelector(t.template);e.template=n}return O=Es({},O,e),b.forEach((function(t){t.dispatchEvent(Rs("medium-zoom:update",{detail:{zoom:$}}))})),$},c=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return t(Es({},O,e))},u=function(){for(var t=arguments.length,e=Array(t),n=0;n0?e.reduce((function(t,e){return[].concat(t,Ps(e))}),[]):b;return r.forEach((function(t){t.classList.remove("medium-zoom-image"),t.dispatchEvent(Rs("medium-zoom:detach",{detail:{zoom:$}}))})),b=b.filter((function(t){return-1===r.indexOf(t)})),$},f=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return b.forEach((function(r){r.addEventListener("medium-zoom:"+t,e,n)})),_.push({type:"medium-zoom:"+t,listener:e,options:n}),$},p=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return b.forEach((function(r){r.removeEventListener("medium-zoom:"+t,e,n)})),_=_.filter((function(n){return!(n.type==="medium-zoom:"+t&&n.listener.toString()===e.toString())})),$},d=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.target,n=function(){var t={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},e=void 0,n=void 0;if(O.container)if(O.container instanceof Object)e=(t=Es({},t,O.container)).width-t.left-t.right-2*O.margin,n=t.height-t.top-t.bottom-2*O.margin;else{var r=(Ts(O.container)?O.container:document.querySelector(O.container)).getBoundingClientRect(),o=r.width,i=r.height,a=r.left,s=r.top;t=Es({},t,{width:o,height:i,left:a,top:s})}e=e||t.width-2*O.margin,n=n||t.height-2*O.margin;var c=S.zoomedHd||S.original,u=As(c)?e:c.naturalWidth||e,l=As(c)?n:c.naturalHeight||n,f=c.getBoundingClientRect(),p=f.top,d=f.left,h=f.width,v=f.height,m=Math.min(Math.max(h,u),e)/h,g=Math.min(Math.max(v,l),n)/v,y=Math.min(m,g),b="scale("+y+") translate3d("+((e-h)/2-d+O.margin+t.left)/y+"px, "+((n-v)/2-p+O.margin+t.top)/y+"px, 0)";S.zoomed.style.transform=b,S.zoomedHd&&(S.zoomedHd.style.transform=b)};return new r((function(t){if(e&&-1===b.indexOf(e))t($);else{if(S.zoomed)t($);else{if(e)S.original=e;else{if(!(b.length>0))return void t($);var r=b;S.original=r[0]}if(S.original.dispatchEvent(Rs("medium-zoom:open",{detail:{zoom:$}})),x=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,w=!0,S.zoomed=zs(S.original),document.body.appendChild(C),O.template){var o=Ts(O.template)?O.template:document.querySelector(O.template);S.template=document.createElement("div"),S.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(S.template)}if(S.original.parentElement&&"PICTURE"===S.original.parentElement.tagName&&S.original.currentSrc&&(S.zoomed.src=S.original.currentSrc),document.body.appendChild(S.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),S.original.classList.add("medium-zoom-image--hidden"),S.zoomed.classList.add("medium-zoom-image--opened"),S.zoomed.addEventListener("click",h),S.zoomed.addEventListener("transitionend",(function e(){w=!1,S.zoomed.removeEventListener("transitionend",e),S.original.dispatchEvent(Rs("medium-zoom:opened",{detail:{zoom:$}})),t($)})),S.original.getAttribute("data-zoom-src")){S.zoomedHd=S.zoomed.cloneNode(),S.zoomedHd.removeAttribute("srcset"),S.zoomedHd.removeAttribute("sizes"),S.zoomedHd.removeAttribute("loading"),S.zoomedHd.src=S.zoomed.getAttribute("data-zoom-src"),S.zoomedHd.onerror=function(){clearInterval(i),console.warn("Unable to reach the zoom image target "+S.zoomedHd.src),S.zoomedHd=null,n()};var i=setInterval((function(){S.zoomedHd.complete&&(clearInterval(i),S.zoomedHd.classList.add("medium-zoom-image--opened"),S.zoomedHd.addEventListener("click",h),document.body.appendChild(S.zoomedHd),n())}),10)}else if(S.original.hasAttribute("srcset")){S.zoomedHd=S.zoomed.cloneNode(),S.zoomedHd.removeAttribute("sizes"),S.zoomedHd.removeAttribute("loading");var a=S.zoomedHd.addEventListener("load",(function(){S.zoomedHd.removeEventListener("load",a),S.zoomedHd.classList.add("medium-zoom-image--opened"),S.zoomedHd.addEventListener("click",h),document.body.appendChild(S.zoomedHd),n()}))}else n()}}}))},h=function(){return new r((function(t){if(!w&&S.original){w=!0,document.body.classList.remove("medium-zoom--opened"),S.zoomed.style.transform="",S.zoomedHd&&(S.zoomedHd.style.transform=""),S.template&&(S.template.style.transition="opacity 150ms",S.template.style.opacity=0),S.original.dispatchEvent(Rs("medium-zoom:close",{detail:{zoom:$}})),S.zoomed.addEventListener("transitionend",(function e(){S.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(S.zoomed),S.zoomedHd&&document.body.removeChild(S.zoomedHd),document.body.removeChild(C),S.zoomed.classList.remove("medium-zoom-image--opened"),S.template&&document.body.removeChild(S.template),w=!1,S.zoomed.removeEventListener("transitionend",e),S.original.dispatchEvent(Rs("medium-zoom:closed",{detail:{zoom:$}})),S.original=null,S.zoomed=null,S.zoomedHd=null,S.template=null,t($)}))}else t($)}))},v=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.target;return S.original?h():d({target:e})},m=function(){return O},g=function(){return b},y=function(){return S.original},b=[],_=[],w=!1,x=0,O=n,S={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(e)?O=e:(e||"string"==typeof e)&&u(e),O=Es({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},O);var C=Ls(O.background);document.addEventListener("click",o),document.addEventListener("keyup",a),document.addEventListener("scroll",i),window.addEventListener("resize",h);var $={open:d,close:h,toggle:v,update:s,clone:c,attach:u,detach:l,on:f,off:p,getOptions:m,getImages:g,getZoomedImage:y};return $},Is={data:()=>({zoom:null}),mounted(){this.updateZoom()},updated(){this.updateZoom()},methods:{updateZoom(){setTimeout(()=>{this.zoom&&this.zoom.detach(),this.zoom=Ms(".theme-default-content :not(a) > img",void 0)},1e3)}}},Ns=n(91),Ds=n.n(Ns),Us=(n(238),[gs,Ss,ks,Is,{mounted(){Ds.a.polyfill()}}]),Hs={name:"GlobalLayout",computed:{layout(){const t=this.getLayout();return ps("layout",t),Kn.component(t)}},methods:{getLayout(){if(this.$page.path){const t=this.$page.frontmatter.layout;return t&&(this.$vuepress.getLayoutAsyncComponent(t)||this.$vuepress.getVueComponent(t))?t:"Layout"}return"NotFound"}}},Bs=n(8),Fs=Object(Bs.a)(Hs,(function(){return(0,this._self._c)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(t,e,n){switch(e){case"components":t[e]||(t[e]={}),Object.assign(t[e],n);break;case"mixins":t[e]||(t[e]=[]),t[e].push(...n);break;default:throw new Error("Unknown option name.")}}(Fs,"mixins",Us);const Vs=[{name:"v-862b2260",path:"/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-862b2260").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-3e0654b8",path:"/part-01/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-3e0654b8").then(n)}},{path:"/part-01/index.html",redirect:"/part-01/"},{name:"v-25a82b36",path:"/part-02/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-25a82b36").then(n)}},{path:"/part-02/index.html",redirect:"/part-02/"},{name:"v-16284f9c",path:"/part-04/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-16284f9c").then(n)}},{path:"/part-04/index.html",redirect:"/part-04/"},{name:"v-46e4a2a0",path:"/part-05/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-46e4a2a0").then(n)}},{path:"/part-05/index.html",redirect:"/part-05/"},{name:"v-0d4a01b4",path:"/part-03/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-0d4a01b4").then(n)}},{path:"/part-03/index.html",redirect:"/part-03/"},{name:"v-77a0f5a4",path:"/part-06/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-77a0f5a4").then(n)}},{path:"/part-06/index.html",redirect:"/part-06/"},{name:"v-a85d48a8",path:"/part-07/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-a85d48a8").then(n)}},{path:"/part-07/index.html",redirect:"/part-07/"},{name:"v-d9199bac",path:"/part-08/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-d9199bac").then(n)}},{path:"/part-08/index.html",redirect:"/part-08/"},{name:"v-7b1508a8",path:"/part-09/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-7b1508a8").then(n)}},{path:"/part-09/index.html",redirect:"/part-09/"},{name:"v-62fd777c",path:"/part-10/",component:Fs,beforeEnter:(t,e,n)=>{fs("Layout","v-62fd777c").then(n)}},{path:"/part-10/index.html",redirect:"/part-10/"},{path:"*",component:Fs}],qs={title:"Kubernetes + Knative + GitLab + Harbor",description:"Kubernetes + Knative + GitLab + Harbor",base:"/k8s-knative-gitlab-harbor/",headTags:[["link",{rel:"icon",href:"https://kubernetes.io/images/favicon.png"}]],pages:[{title:"Kubernetes + Knative + GitLab + Harbor",frontmatter:{readingShow:"top"},regularPath:"/",relativePath:"README.md",key:"v-862b2260",path:"/",headers:[{level:2,title:"Requirements",slug:"requirements"},{level:2,title:"Content",slug:"content"},{level:2,title:"Asciinema",slug:"asciinema"}],lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3},{title:"Create k8s cluster",frontmatter:{readingShow:"top"},regularPath:"/part-01/",relativePath:"part-01/README.md",key:"v-3e0654b8",path:"/part-01/",headers:[{level:2,title:"Prepare the local working environment",slug:"prepare-the-local-working-environment"},{level:2,title:"Configure AWS",slug:"configure-aws"},{level:2,title:"Create K8s in AWS",slug:"create-k8s-in-aws"}],lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3},{title:"Install Helm",frontmatter:{readingShow:"top"},regularPath:"/part-02/",relativePath:"part-02/README.md",key:"v-25a82b36",path:"/part-02/",lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3},{title:"Install Harbor",frontmatter:{readingShow:"top"},regularPath:"/part-04/",relativePath:"part-04/README.md",key:"v-16284f9c",path:"/part-04/",lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3},{title:"Install GitLab",frontmatter:{readingShow:"top"},regularPath:"/part-05/",relativePath:"part-05/README.md",key:"v-46e4a2a0",path:"/part-05/",lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3},{title:"Istio + Knative + cert-manager + kubed installation",frontmatter:{readingShow:"top"},regularPath:"/part-03/",relativePath:"part-03/README.md",key:"v-0d4a01b4",path:"/part-03/",headers:[{level:2,title:"Install cert-manager",slug:"install-cert-manager"},{level:3,title:"Create ClusterIssuer for Let's Encrypt",slug:"create-clusterissuer-for-let-s-encrypt"},{level:2,title:"Generate TLS certificate",slug:"generate-tls-certificate"},{level:2,title:"Install kubed",slug:"install-kubed"},{level:2,title:"Install Istio",slug:"install-istio"},{level:2,title:"Create DNS records",slug:"create-dns-records"}],lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3},{title:"Install Knative",frontmatter:{readingShow:"top"},regularPath:"/part-06/",relativePath:"part-06/README.md",key:"v-77a0f5a4",path:"/part-06/",headers:[{level:2,title:"Enable automatic TLS certificate provisioning for Knative",slug:"enable-automatic-tls-certificate-provisioning-for-knative"}],lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3},{title:"Build and run container image using Knative + Tekton",frontmatter:{readingShow:"top"},regularPath:"/part-07/",relativePath:"part-07/README.md",key:"v-a85d48a8",path:"/part-07/",lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3},{title:"Automated deployment with Tekton",frontmatter:{readingShow:"top"},regularPath:"/part-08/",relativePath:"part-08/README.md",key:"v-d9199bac",path:"/part-08/",headers:[{level:2,title:"Fork podinfo application",slug:"fork-podinfo-application"},{level:2,title:"Create Tekton Triggers configuration",slug:"create-tekton-triggers-configuration"},{level:3,title:"Configure webhook",slug:"configure-webhook"},{level:2,title:"Change the source code of the app",slug:"change-the-source-code-of-the-app"}],lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3},{title:"Knative operations",frontmatter:{readingShow:"top"},regularPath:"/part-09/",relativePath:"part-09/README.md",key:"v-7b1508a8",path:"/part-09/",lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3},{title:"Clean-up",frontmatter:{readingShow:"top"},regularPath:"/part-10/",relativePath:"part-10/README.md",key:"v-62fd777c",path:"/part-10/",lastUpdated:"4/14/2024, 1:19:24 AM",lastUpdatedTimestamp:1713057564e3}],themeConfig:{displayAllHeaders:!0,lastUpdated:!0,repo:"ruzickap/k8s-knative-gitlab-harbor",docsDir:"docs",editLinks:!0,logo:"https://kubernetes.io/images/favicon.png",nav:[{text:"Home",link:"/"},{text:"Links",items:[{text:"GitLab",link:"https://gitlab.com"},{text:"Harbor",link:"https://goharbor.io"},{text:"Knative",link:"https://cloud.google.com/knative"}]}],sidebar:["/","/part-01/","/part-02/","/part-03/","/part-04/","/part-05/","/part-06/","/part-07/","/part-08/","/part-09/","/part-10/"]}};n(239);Kn.component("Badge",()=>Promise.all([n.e(0),n.e(4)]).then(n.bind(null,318))),Kn.component("CodeBlock",()=>Promise.all([n.e(0),n.e(5)]).then(n.bind(null,314))),Kn.component("CodeGroup",()=>Promise.all([n.e(0),n.e(6)]).then(n.bind(null,315)));n(240);var Ws={name:"BackToTop",props:{threshold:{type:Number,default:300}},data:()=>({scrollTop:null}),computed:{show(){return this.scrollTop>this.threshold}},mounted(){this.scrollTop=this.getScrollTop(),window.addEventListener("scroll",Os()(()=>{this.scrollTop=this.getScrollTop()},100))},methods:{getScrollTop:()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,scrollToTop(){window.scrollTo({top:0,behavior:"smooth"}),this.scrollTop=0}}},Ks=(n(241),Object(Bs.a)(Ws,(function(){var t=this._self._c;return t("transition",{attrs:{name:"fade"}},[this.show?t("svg",{staticClass:"go-to-top",attrs:{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 49.484 28.284"},on:{click:this.scrollToTop}},[t("g",{attrs:{transform:"translate(-229 -126.358)"}},[t("rect",{attrs:{fill:"currentColor",width:"35",height:"5",rx:"2",transform:"translate(229 151.107) rotate(-45)"}}),this._v(" "),t("rect",{attrs:{fill:"currentColor",width:"35",height:"5",rx:"2",transform:"translate(274.949 154.642) rotate(-135)"}})])]):this._e()])}),[],!1,null,"5fd4ef0c",null).exports),Ys={name:"ReadingProgress",data:()=>({readingTop:0,readingHeight:1,progressStyle:null,transform:void 0,running:!1}),watch:{$readingShow(){this.progressStyle=this.getProgressStyle(),this.$readingShow&&window.addEventListener("scroll",this.base)}},mounted(){this.transform=this.getTransform(),this.progressStyle=this.getProgressStyle(),this.$readingShow&&window.addEventListener("scroll",this.base)},beforeDestroy(){this.$readingShow&&window.removeEventListener("scroll",this.base)},methods:{base(){this.running||(this.running=!0,requestAnimationFrame(this.getReadingBase))},getReadingBase(){this.readingHeight=this.getReadingHeight()-this.getScreenHeight(),this.readingTop=this.getReadingTop(),this.progressStyle=this.getProgressStyle(),this.running=!1},getReadingHeight:()=>Math.max(document.body.scrollHeight,document.body.offsetHeight,0),getScreenHeight:()=>Math.max(window.innerHeight,document.documentElement.clientHeight,0),getReadingTop:()=>Math.max(window.pageYOffset,document.documentElement.scrollTop,0),getTransform(){const t=document.createElement("div");return["transform","-webkit-transform","-moz-transform","-o-transform","-ms-transform"].find(e=>e in t.style)||void 0},getProgressStyle(){const t=this.readingTop/this.readingHeight;switch(this.$readingShow){case"top":case"bottom":return this.transform?`${this.transform}: scaleX(${t})`:`width: ${100*t}%`;case"left":case"right":return this.transform?`${this.transform}: scaleY(${t})`:`height: ${100*t}%`;default:return null}}}},Xs=(n(242),Object(Bs.a)(Ys,(function(){var t=this._self._c;return t("ClientOnly",[this.$readingShow?t("div",{staticClass:"reading-progress",class:this.$readingShow},[t("div",{staticClass:"progress",style:this.progressStyle})]):this._e()])}),[],!1,null,"3640397f",null).exports);function Gs(t){const e=document.documentElement.getBoundingClientRect(),n=t.getBoundingClientRect();return{x:n.left-e.left,y:n.top-e.top}}var Js=[{},({Vue:t})=>{t.mixin({computed:{$dataBlock(){return this.$options.__data__block__}}})},{},{},({Vue:t})=>{t.component("BackToTop",Ks)},({Vue:t})=>{t.component(Xs.name,Xs),t.mixin({computed:{$readingShow(){return this.$page.frontmatter.readingShow}}})},({Vue:t,router:e})=>{e.options.scrollBehavior=(e,n,r)=>{if(r)return window.scrollTo({top:r.y,behavior:"smooth"});if(!e.hash)return window.scrollTo({top:0,behavior:"smooth"});{if(t.$vuepress.$get("disableScrollBehavior"))return;const n=e.hash.slice(1),r=document.getElementById(n)||document.querySelector(`[name='${n}']`);if(r)return window.scrollTo({top:Gs(r).y,behavior:"smooth"})}}}],Zs=["BackToTop","ReadingProgress"];class Qs extends class{constructor(){this.store=new Kn({data:{state:{}}})}$get(t){return this.store.state[t]}$set(t,e){Kn.set(this.store.state,t,e)}$emit(...t){this.store.$emit(...t)}$on(...t){this.store.$on(...t)}}{}Object.assign(Qs.prototype,{getPageAsyncComponent:ss,getLayoutAsyncComponent:cs,getAsyncComponent:us,getVueComponent:ls});var tc={install(t){const e=new Qs;t.$vuepress=e,t.prototype.$vuepress=e}};function ec(t,e){const n=e.toLowerCase();return t.options.routes.some(t=>t.path.toLowerCase()===n)}var nc={props:{pageKey:String,slotKey:{type:String,default:"default"}},render(t){const e=this.pageKey||this.$parent.$page.key;return ps("pageKey",e),Kn.component(e)||Kn.component(e,ss(e)),Kn.component(e)?t(e):t("")}},rc={functional:!0,props:{slotKey:String,required:!0},render:(t,{props:e,slots:n})=>t("div",{class:["content__"+e.slotKey]},n()[e.slotKey])},oc={computed:{openInNewWindowTitle(){return this.$themeLocaleConfig.openNewWindowText||"(opens new window)"}}},ic=(n(243),n(244),Object(Bs.a)(oc,(function(){var t=this._self._c;return t("span",[t("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[t("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),this._v(" "),t("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})]),this._v(" "),t("span",{staticClass:"sr-only"},[this._v(this._s(this.openInNewWindowTitle))])])}),[],!1,null,null,null).exports),ac={functional:!0,render(t,{parent:e,children:n}){if(e._isMounted)return n;e.$once("hook:mounted",()=>{e.$forceUpdate()})}};Kn.config.productionTip=!1,Kn.use(qa),Kn.use(tc),Kn.mixin(function(t,e,n=Kn){!function(t){t.locales&&Object.keys(t.locales).forEach(e=>{t.locales[e].path=e});Object.freeze(t)}(e),n.$vuepress.$set("siteData",e);const r=new(t(n.$vuepress.$get("siteData"))),o=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(r)),i={};return Object.keys(o).reduce((t,e)=>(e.startsWith("$")&&(t[e]=o[e].get),t),i),{computed:i}}(t=>class{setPage(t){this.__page=t}get $site(){return t}get $themeConfig(){return this.$site.themeConfig}get $frontmatter(){return this.$page.frontmatter}get $localeConfig(){const{locales:t={}}=this.$site;let e,n;for(const r in t)"/"===r?n=t[r]:0===this.$page.path.indexOf(r)&&(e=t[r]);return e||n||{}}get $siteTitle(){return this.$localeConfig.title||this.$site.title||""}get $canonicalUrl(){const{canonicalUrl:t}=this.$page.frontmatter;return"string"==typeof t&&t}get $title(){const t=this.$page,{metaTitle:e}=this.$page.frontmatter;if("string"==typeof e)return e;const n=this.$siteTitle,r=t.frontmatter.home?null:t.frontmatter.title||t.title;return n?r?r+" | "+n:n:r||"VuePress"}get $description(){const t=function(t){if(t){const e=t.filter(t=>"description"===t.name)[0];if(e)return e.content}}(this.$page.frontmatter.meta);return t||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}get $lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}get $localePath(){return this.$localeConfig.path||"/"}get $themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}get $page(){return this.__page?this.__page:function(t,e){for(let n=0;nn||(t.hash?!Kn.$vuepress.$get("disableScrollBehavior")&&{selector:decodeURIComponent(t.hash)}:{x:0,y:0})});!function(t){t.beforeEach((e,n,r)=>{if(ec(t,e.path))r();else if(/(\/|\.html)$/.test(e.path))if(/\/$/.test(e.path)){const n=e.path.replace(/\/$/,"")+".html";ec(t,n)?r(n):r()}else r();else{const n=e.path+"/",o=e.path+".html";ec(t,o)?r(o):ec(t,n)?r(n):r()}})}(n);const r={};try{await Promise.all(Js.filter(t=>"function"==typeof t).map(e=>e({Vue:Kn,options:r,router:n,siteData:qs,isServer:t})))}catch(t){console.error(t)}return{app:new Kn(Object.assign(r,{router:n,render:t=>t("div",{attrs:{id:"app"}},[t("RouterView",{ref:"layout"}),t("div",{class:"global-ui"},Zs.map(e=>t(e)))])})),router:n}}(!1).then(({app:t,router:e})=>{e.onReady(()=>{t.$mount("#app")})})}]); \ No newline at end of file diff --git a/assets/js/vendors~docsearch.857e8e87.js b/assets/js/vendors~docsearch.857e8e87.js new file mode 100644 index 0000000..2268f29 --- /dev/null +++ b/assets/js/vendors~docsearch.857e8e87.js @@ -0,0 +1,3 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{311:function(t,e,n){ +/*! docsearch 2.6.3 | © Algolia | github.com/algolia/docsearch */ +var r;"undefined"!=typeof self&&self,r=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=22)}([function(t,e,n){"use strict";var r,i=n(1);function s(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}t.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(t){if(void 0===t&&(t=navigator.userAgent),/(msie|trident)/i.test(t)){var e=t.match(/(msie |rv:)(\d+(.\d+)?)/i);if(e)return e[2]}return!1},escapeRegExChars:function(t){return t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(t){return"number"==typeof t},toStr:function(t){return null==t?"":t+""},cloneDeep:function(t){var e=this.mixin({},t),n=this;return this.each(e,(function(t,r){t&&(n.isArray(t)?e[r]=[].concat(t):n.isObject(t)&&(e[r]=n.cloneDeep(t)))})),e},error:function(t){throw new Error(t)},every:function(t,e){var n=!0;return t?(this.each(t,(function(r,i){n&&(n=e.call(null,r,i,t)&&n)})),!!n):n},any:function(t,e){var n=!1;return t?(this.each(t,(function(r,i){if(e.call(null,r,i,t))return n=!0,!1})),n):n},getUniqueId:(r=0,function(){return r++}),templatify:function(t){if(this.isFunction(t))return t;var e=i.element(t);return"SCRIPT"===e.prop("tagName")?function(){return e.text()}:function(){return String(t)}},defer:function(t){setTimeout(t,0)},noop:function(){},formatPrefix:function(t,e){return e?"":t+"-"},className:function(t,e,n){return(n?"":".")+t+e},escapeHighlightedString:function(t,e,n){e=e||"";var r=document.createElement("div");r.appendChild(document.createTextNode(e)),n=n||"";var i=document.createElement("div");i.appendChild(document.createTextNode(n));var o=document.createElement("div");return o.appendChild(document.createTextNode(t)),o.innerHTML.replace(RegExp(s(r.innerHTML),"g"),e).replace(RegExp(s(i.innerHTML),"g"),n)}}},function(t,e,n){"use strict";t.exports={element:null}},function(t,e){var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString;t.exports=function(t,e,i){if("[object Function]"!==r.call(e))throw new TypeError("iterator must be a function");var s=t.length;if(s===+s)for(var o=0;o was loaded but did not call our provided callback"),JSONPScriptError:s("JSONPScriptError"," + + diff --git a/part-01/index.html b/part-01/index.html new file mode 100644 index 0000000..271d8cb --- /dev/null +++ b/part-01/index.html @@ -0,0 +1,181 @@ + + + + + + Create k8s cluster | Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

# Create k8s cluster

Before starting with the main content, it's necessary to provision +the Kubernetes in AWS.

Use the MY_DOMAIN variable containing domain and LETSENCRYPT_ENVIRONMENT +variable. +The LETSENCRYPT_ENVIRONMENT variable should be one of:

  • staging - Let’s Encrypt will create testing certificate (not valid)

  • production - Let’s Encrypt will create valid certificate (use with care)

export MY_DOMAIN=${MY_DOMAIN:-mylabs.dev}
+export LETSENCRYPT_ENVIRONMENT=${LETSENCRYPT_ENVIRONMENT:-staging}
+echo "${MY_DOMAIN} | ${LETSENCRYPT_ENVIRONMENT}"
+

# Prepare the local working environment

TIP

You can skip these steps if you have all the required software already +installed.

Install necessary software:

if [ -x /usr/bin/apt ]; then
+  apt update -qq
+  DEBIAN_FRONTEND=noninteractive apt-get install -y -qq awscli curl docker.io gettext-base git jq openssh-client sudo wget > /dev/null
+fi
+

Install kubectl (opens new window) binary:

if [ ! -x /usr/local/bin/kubectl ]; then
+  sudo curl -s -Lo /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
+  sudo chmod a+x /usr/local/bin/kubectl
+fi
+

Install kops (opens new window):

if [ ! -x /usr/local/bin/kops ]; then
+  curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | jq -r '.tag_name')/kops-linux-amd64
+  chmod +x kops-linux-amd64
+  sudo mv kops-linux-amd64 /usr/local/bin/kops
+fi
+

Install kn client for Knative:

if [ ! -x /usr/local/bin/kn ]; then
+  sudo curl -s -L "https://github.com/knative/client/releases/download/v0.11.0/kn-linux-amd64" -o /usr/local/bin/kn
+  sudo chmod a+x /usr/local/bin/kn
+fi
+

Install tkn client for Tekton:

if [ ! -x /usr/local/bin/tkn ]; then
+  curl -s -L https://github.com/tektoncd/cli/releases/download/v0.6.0/tkn_0.6.0_Linux_x86_64.tar.gz | tar xzf - -C /tmp/
+  sudo mv /tmp/tkn /usr/local/bin/
+fi
+

Install hub (opens new window):

if [ ! -x /usr/local/bin/hub ]; then
+  curl -s -L https://github.com/github/hub/releases/download/v2.13.0/hub-linux-amd64-2.13.0.tgz | tar xzf - -C /tmp/
+  sudo mv /tmp/hub-linux-amd64-2.13.0/bin/hub /usr/local/bin/
+fi
+

# Configure AWS

Authorize to AWS using AWS CLI: Configuring the AWS CLI (opens new window)

aws configure
+...
+

Create DNS zone:

aws route53 create-hosted-zone --name ${MY_DOMAIN} --caller-reference ${MY_DOMAIN}
+

Use your domain registrar to change the nameservers for your zone (for example +mylabs.dev) to use the Amazon Route 53 nameservers. Here is the way how you +can find out the the Route 53 nameservers:

aws route53 get-hosted-zone --id $(aws route53 list-hosted-zones --query "HostedZones[?Name==\`${MY_DOMAIN}.\`].Id" --output text) --query "DelegationSet.NameServers"
+

Create policy allowing the cert-manager to change Route 53 settings. This will +allow cert-manager to generate wildcard SSL certificates by Let's Encrypt +certificate authority.

test -d tmp || mkdir tmp
+envsubst < files/user_policy.json > tmp/user_policy.json
+
+aws iam create-policy \
+  --policy-name ${USER}-k8s-${MY_DOMAIN} \
+  --description "Policy for ${USER}-k8s-${MY_DOMAIN}" \
+  --policy-document file://tmp/user_policy.json \
+| jq
+

Output:

{
+  "Policy": {
+    "PolicyName": "pruzicka-k8s-mylabs.dev",
+    "PolicyId": "xxxxxxxxxxxxxxxxxxxx",
+    "Arn": "arn:aws:iam::822044714040:policy/pruzicka-k8s-mylabs.dev",
+    "Path": "/",
+    "DefaultVersionId": "v1",
+    "AttachmentCount": 0,
+    "PermissionsBoundaryUsageCount": 0,
+    "IsAttachable": true,
+    "CreateDate": "2019-12-27T09:41:14Z",
+    "UpdateDate": "2019-12-27T09:41:14Z"
+  }
+}
+

Create user which will use the policy above:

aws iam create-user --user-name ${USER}-k8s-${MY_DOMAIN} | jq && \
+POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName==\`${USER}-k8s-${MY_DOMAIN}\`].{ARN:Arn}" --output text) && \
+aws iam attach-user-policy --user-name "${USER}-k8s-${MY_DOMAIN}" --policy-arn $POLICY_ARN && \
+aws iam create-access-key --user-name ${USER}-k8s-${MY_DOMAIN} > $HOME/.aws/${USER}-k8s-${MY_DOMAIN} && \
+export USER_AWS_ACCESS_KEY_ID=$(awk -F\" "/AccessKeyId/ { print \$4 }" $HOME/.aws/${USER}-k8s-${MY_DOMAIN}) && \
+export USER_AWS_SECRET_ACCESS_KEY=$(awk -F\" "/SecretAccessKey/ { print \$4 }" $HOME/.aws/${USER}-k8s-${MY_DOMAIN})
+

Output:

{
+  "User": {
+    "Path": "/",
+    "UserName": "pruzicka-k8s-mylabs.dev",
+    "UserId": "xxxxxxxxxxxxxxxxxxxx",
+    "Arn": "arn:aws:iam::822044714040:user/pruzicka-k8s-mylabs.dev",
+    "CreateDate": "2019-12-27T09:41:27Z"
+  }
+}
+

The AccessKeyId and SecretAccessKey is need for creating the ClusterIssuer +definition for cert-manager.

# Create K8s in AWS

Architecture

Generate SSH keys if not exists:

test -f $HOME/.ssh/id_rsa || ( install -m 0700 -d $HOME/.ssh && ssh-keygen -b 2048 -t rsa -f $HOME/.ssh/id_rsa -q -N "" )
+

Clone the k8s-knative-gitlab-harbor Git repository if it wasn't done already:

if [ ! -d .git ]; then
+  git clone --quiet https://github.com/ruzickap/k8s-k8s-knative-gitlab-harbor && cd k8s-knative-gitlab-harbor
+fi
+

Create S3 bucket where the kops will store cluster status:

aws s3api create-bucket --bucket ${USER}-kops-k8s --region eu-central-1 --create-bucket-configuration LocationConstraint=eu-central-1 | jq
+

Output:

{
+  "Location": "http://pruzicka-kops-k8s.s3.amazonaws.com/"
+}
+

Create Kubernetes cluster in AWS by using kops (opens new window):

kops create cluster \
+  --name=${USER}-k8s.${MY_DOMAIN} \
+  --state=s3://${USER}-kops-k8s \
+  --zones=eu-central-1a \
+  --networking=amazon-vpc-routed-eni \
+  --node-count=5 \
+  --node-size=t3.large \
+  --node-volume-size=20 \
+  --master-count=1 \
+  --master-size=t3.small \
+  --master-volume-size=10 \
+  --dns-zone=${MY_DOMAIN} \
+  --cloud-labels "Owner=${USER},Environment=Test,Division=Services" \
+  --ssh-public-key $HOME/.ssh/id_rsa.pub \
+  --yes
+

Output:

...
+I1227 10:42:09.459809   15782 executor.go:103] Tasks: 91 done / 91 total; 0 can run
+I1227 10:42:09.459901   15782 dns.go:155] Pre-creating DNS records
+I1227 10:42:10.791005   15782 update_cluster.go:294] Exporting kubecfg for cluster
+kops has set your kubectl context to pruzicka-k8s.mylabs.dev
+
+Cluster changes have been applied to the cloud.
+
+
+Changes may require instances to restart: kops rolling-update cluster
+

Wait for cluster to be up and running:

sleep 200
+while `kops validate cluster --state=s3://${USER}-kops-k8s -o yaml 2>&1 | grep -q failures`; do sleep 5; echo -n .; done
+echo
+

Store kubeconfig in current directory:

kops export kubecfg ${USER}-k8s.${MY_DOMAIN} --state=s3://${USER}-kops-k8s --kubeconfig kubeconfig.conf
+

Check if the new Kubernetes cluster is available:

export KUBECONFIG=$PWD/kubeconfig.conf
+kubectl get nodes -o wide
+

Output:

NAME                                             STATUS   ROLES    AGE     VERSION   INTERNAL-IP     EXTERNAL-IP      OS-IMAGE                       KERNEL-VERSION   CONTAINER-RUNTIME
+ip-172-20-37-106.eu-central-1.compute.internal   Ready    master   2m23s   v1.15.6   172.20.37.106   35.159.31.183    Debian GNU/Linux 9 (stretch)   4.9.0-11-amd64   docker://18.6.3
+ip-172-20-37-122.eu-central-1.compute.internal   Ready    node     56s     v1.15.6   172.20.37.122   3.120.151.131    Debian GNU/Linux 9 (stretch)   4.9.0-11-amd64   docker://18.6.3
+ip-172-20-37-204.eu-central-1.compute.internal   Ready    node     32s     v1.15.6   172.20.37.204   18.196.187.216   Debian GNU/Linux 9 (stretch)   4.9.0-11-amd64   docker://18.6.3
+ip-172-20-47-14.eu-central-1.compute.internal    Ready    node     67s     v1.15.6   172.20.47.14    18.196.173.69    Debian GNU/Linux 9 (stretch)   4.9.0-11-amd64   docker://18.6.3
+ip-172-20-47-61.eu-central-1.compute.internal    Ready    node     53s     v1.15.6   172.20.47.61    18.184.73.151    Debian GNU/Linux 9 (stretch)   4.9.0-11-amd64   docker://18.6.3
+ip-172-20-59-57.eu-central-1.compute.internal    Ready    node     83s     v1.15.6   172.20.59.57    54.93.48.121     Debian GNU/Linux 9 (stretch)   4.9.0-11-amd64   docker://18.6.3
+

In case of using staging environment add "Let's Encrypt testing" fakelerootx1.pem (opens new window) +as trusted certificate authority:

wget -q https://letsencrypt.org/certs/fakelerootx1.pem -O tmp/fakelerootx1.pem
+if [ ${LETSENCRYPT_ENVIRONMENT} = "staging" ]; then
+  sudo mkdir -pv /etc/docker/certs.d/harbor.${MY_DOMAIN}/
+  sudo cp tmp/fakelerootx1.pem /etc/docker/certs.d/harbor.${MY_DOMAIN}/ca.crt
+  for EXTERNAL_IP in $(kubectl get nodes --output=jsonpath="{.items[*].status.addresses[?(@.type==\"ExternalIP\")].address}"); do
+    ssh -q -o StrictHostKeyChecking=no -l admin ${EXTERNAL_IP} \
+      "sudo mkdir -p /etc/docker/certs.d/harbor.${MY_DOMAIN}/ && sudo wget -q https://letsencrypt.org/certs/fakelerootx1.pem -O /etc/docker/certs.d/harbor.${MY_DOMAIN}/ca.crt"
+  done
+  echo "*** Done"
+fi
+
+ + + diff --git a/part-02/index.html b/part-02/index.html new file mode 100644 index 0000000..bb1387c --- /dev/null +++ b/part-02/index.html @@ -0,0 +1,77 @@ + + + + + + Install Helm | Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

# Install Helm

Install Helm (opens new window) binary:

curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
+

Output:

Downloading https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz
+Preparing to install helm into /usr/local/bin
+helm installed into /usr/local/bin/helm
+

Add the "stable" repository:

helm repo add stable https://kubernetes-charts.storage.googleapis.com/
+helm repo update
+

Output:

"stable" has been added to your repositories
+Hang tight while we grab the latest from your chart repositories...
+...Successfully got an update from the "stable" chart repository
+Update Complete. ⎈ Happy Helming!⎈
+

Install kube2iam to restrict pod's access:

helm install kube2iam stable/kube2iam --namespace=kube-system \
+  --set host.iptables=true \
+  --set rbac.create=true
+

Output:

NAME: kube2iam
+LAST DEPLOYED: Fri Dec 27 10:48:20 2019
+NAMESPACE: kube-system
+STATUS: deployed
+REVISION: 1
+TEST SUITE: None
+NOTES:
+To verify that kube2iam has started, run:
+
+  kubectl --namespace=kube-system get pods -l "app.kubernetes.io/name=kube2iam,app.kubernetes.io/instance=kube2iam"
+
+Add an iam.amazonaws.com/role annotation to your pods with the role you want them to assume.
+
+  https://github.com/jtblin/kube2iam#kubernetes-annotation
+
+Use `curl` to verify the pod's role from within:
+
+  curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
+
+ + + diff --git a/part-03/index.html b/part-03/index.html new file mode 100644 index 0000000..fcbc9aa --- /dev/null +++ b/part-03/index.html @@ -0,0 +1,383 @@ + + + + + + Istio + Knative + cert-manager + kubed installation | Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

# Istio + Knative + cert-manager + kubed installation

Before we move on with other tasks it is necessary to install Nginx Ingress. +It's also handy to install cert-manager for managing SSL certificates.

# Install cert-manager

cert-manager architecture:

cert-manager high level overview

Install the CRDs resources separately:

kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.10/deploy/manifests/00-crds.yaml
+sleep 5
+

Create the namespace for cert-manager and label it to disable resource +validation:

kubectl create namespace cert-manager
+kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true
+

Install the cert-manager Helm chart:

helm repo add jetstack https://charts.jetstack.io
+helm repo update
+helm install cert-manager --namespace cert-manager --wait jetstack/cert-manager --version v0.10.1
+

Output:

"jetstack" has been added to your repositories
+Hang tight while we grab the latest from your chart repositories...
+...Successfully got an update from the "jetstack" chart repository
+...Successfully got an update from the "stable" chart repository
+Update Complete. ⎈ Happy Helming!⎈
+NAME: cert-manager
+LAST DEPLOYED: Fri Dec 27 10:48:40 2019
+NAMESPACE: cert-manager
+STATUS: deployed
+REVISION: 1
+TEST SUITE: None
+NOTES:
+cert-manager has been deployed successfully!
+
+In order to begin issuing certificates, you will need to set up a ClusterIssuer
+or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).
+
+More information on the different types of issuers and how to configure them
+can be found in our documentation:
+
+https://docs.cert-manager.io/en/latest/reference/issuers.html
+
+For information on how to configure cert-manager to automatically provision
+Certificates for Ingress resources, take a look at the `ingress-shim`
+documentation:
+
+https://docs.cert-manager.io/en/latest/reference/ingress-shim.html
+

# Create ClusterIssuer for Let's Encrypt

Create ClusterIssuer for Route53 used by cert-manager. It will allow Let's +Encrypt to generate certificate. Route53 (DNS) method of requesting certificate +from Let's Encrypt must be used to create wildcard certificate *.mylabs.dev +(details here (opens new window)).

ACME DNS Challenge

(https://b3n.org/intranet-ssl-certificates-using-lets-encrypt-dns-01/ (opens new window))

export USER_AWS_SECRET_ACCESS_KEY_BASE64=$(echo -n "$USER_AWS_SECRET_ACCESS_KEY" | base64)
+cat << EOF | kubectl apply -f -
+apiVersion: v1
+kind: Secret
+metadata:
+  name: aws-user-secret-access-key-secret
+  namespace: cert-manager
+data:
+  secret-access-key: $USER_AWS_SECRET_ACCESS_KEY_BASE64
+---
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: ClusterIssuer
+metadata:
+  name: letsencrypt-staging-dns
+  namespace: cert-manager
+spec:
+  acme:
+    server: https://acme-staging-v02.api.letsencrypt.org/directory
+    email: petr.ruzicka@gmail.com
+    privateKeySecretRef:
+      name: letsencrypt-staging-dns
+    dns01:
+      providers:
+      - name: aws-route53
+        route53:
+          accessKeyID: ${USER_AWS_ACCESS_KEY_ID}
+          region: eu-central-1
+          secretAccessKeySecretRef:
+            name: aws-user-secret-access-key-secret
+            key: secret-access-key
+---
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: ClusterIssuer
+metadata:
+  name: letsencrypt-production-dns
+  namespace: cert-manager
+spec:
+  acme:
+    server: https://acme-v02.api.letsencrypt.org/directory
+    email: petr.ruzicka@gmail.com
+    privateKeySecretRef:
+      name: letsencrypt-production-dns
+    dns01:
+      providers:
+      - name: aws-route53
+        route53:
+          accessKeyID: ${USER_AWS_ACCESS_KEY_ID}
+          region: eu-central-1
+          secretAccessKeySecretRef:
+            name: aws-user-secret-access-key-secret
+            key: secret-access-key
+EOF
+

# Generate TLS certificate

Create certificate using cert-manager:

cat << EOF | kubectl apply -f -
+apiVersion: certmanager.k8s.io/v1alpha1
+kind: Certificate
+metadata:
+  name: ingress-cert-${LETSENCRYPT_ENVIRONMENT}
+  namespace: cert-manager
+spec:
+  secretName: ingress-cert-${LETSENCRYPT_ENVIRONMENT}
+  issuerRef:
+    kind: ClusterIssuer
+    name: letsencrypt-${LETSENCRYPT_ENVIRONMENT}-dns
+  commonName: "*.${MY_DOMAIN}"
+  dnsNames:
+  - "*.${MY_DOMAIN}"
+  acme:
+    config:
+    - dns01:
+        provider: aws-route53
+      domains:
+      - "*.${MY_DOMAIN}"
+EOF
+

(https://www.openshift.com/blog/self-serviced-end-to-end-encryption-approaches-for-applications-deployed-in-openshift (opens new window))

# Install kubed

It's necessary to copy the wildcard certificate across all "future" namespaces +and that's the reason why kubed (opens new window) needs to be +installed (for now). +kubed (opens new window) can synchronize ConfigMaps/Secrets (opens new window) +across Kubernetes namespaces/clusters.

Kubed - synchronize secret diagram:

Kubed - synchronize secret

Add kubed helm repository:

helm repo add appscode https://charts.appscode.com/stable/
+helm repo update
+

Install kubed:

helm install kubed appscode/kubed --version 0.11.0 --namespace kube-system --wait \
+  --set apiserver.enabled=false \
+  --set config.clusterName=my_k8s_cluster
+

Output:

NAME: kubed
+LAST DEPLOYED: Fri Dec 27 10:49:39 2019
+NAMESPACE: kube-system
+STATUS: deployed
+REVISION: 1
+TEST SUITE: None
+NOTES:
+To verify that Kubed has started, run:
+
+  kubectl --namespace=kube-system get deployments -l "release=kubed, app=kubed"
+

Annotate (mark) the cert-manager secret to be copied to other namespaces +if necessary:

kubectl annotate secret ingress-cert-${LETSENCRYPT_ENVIRONMENT} -n cert-manager kubed.appscode.com/sync="app=kubed"
+

# Install Istio

Add Istio helm chart repository:

export ISTIO_VERSION="1.3.6"
+helm repo add istio.io https://storage.googleapis.com/istio-release/releases/${ISTIO_VERSION}/charts/
+helm repo update
+

Install CRDs for Istio:

kubectl create namespace istio-system
+helm install istio-init istio.io/istio-init --wait --namespace istio-system --version ${ISTIO_VERSION}
+kubectl -n istio-system wait --for=condition=complete job --all
+

Output:

namespace/istio-system created
+NAME: istio-init
+LAST DEPLOYED: Fri Dec 27 10:49:56 2019
+NAMESPACE: istio-system
+STATUS: deployed
+REVISION: 1
+TEST SUITE: None
+job.batch/istio-init-crd-10-1.3.6 condition met
+job.batch/istio-init-crd-11-1.3.6 condition met
+job.batch/istio-init-crd-12-1.3.6 condition met
+

Label Istio namespace and which will trigger kubed to copy there the secret +with certificates signed by Let's Encrypt:

kubectl label namespace istio-system app=kubed
+

Install Istio:

(steps take from Knative page (opens new window))

helm install istio istio.io/istio --wait --namespace istio-system --version ${ISTIO_VERSION} \
+  --set gateways.istio-ingressgateway.autoscaleMax=1 \
+  --set gateways.istio-ingressgateway.autoscaleMin=1 \
+  --set gateways.istio-ingressgateway.ports[0].name=status-port \
+  --set gateways.istio-ingressgateway.ports[0].port=15020 \
+  --set gateways.istio-ingressgateway.ports[0].targetPort=15020 \
+  --set gateways.istio-ingressgateway.ports[1].name=http \
+  --set gateways.istio-ingressgateway.ports[1].nodePort=31380 \
+  --set gateways.istio-ingressgateway.ports[1].port=80 \
+  --set gateways.istio-ingressgateway.ports[1].targetPort=80 \
+  --set gateways.istio-ingressgateway.ports[2].name=https \
+  --set gateways.istio-ingressgateway.ports[2].nodePort=31390 \
+  --set gateways.istio-ingressgateway.ports[2].port=443 \
+  --set gateways.istio-ingressgateway.ports[3].name=ssh \
+  --set gateways.istio-ingressgateway.ports[3].nodePort=31400 \
+  --set gateways.istio-ingressgateway.ports[3].port=22 \
+  --set gateways.istio-ingressgateway.sds.enabled=true \
+  --set global.disablePolicyChecks=true \
+  --set global.k8sIngress.enableHttps=true \
+  --set global.k8sIngress.enabled=true \
+  --set global.proxy.autoInject=disabled \
+  --set grafana.datasources."datasources\.yaml".datasources[0].access=proxy \
+  --set grafana.datasources."datasources\.yaml".datasources[0].editable=true \
+  --set grafana.datasources."datasources\.yaml".datasources[0].isDefault=true \
+  --set grafana.datasources."datasources\.yaml".datasources[0].jsonData.timeInterval=5s \
+  --set grafana.datasources."datasources\.yaml".datasources[0].name=Prometheus \
+  --set grafana.datasources."datasources\.yaml".datasources[0].orgId=1 \
+  --set grafana.datasources."datasources\.yaml".datasources[0].type=prometheus \
+  --set grafana.datasources."datasources\.yaml".datasources[0].url=http://prometheus-system-np.knative-monitoring.svc.cluster.local:8080 \
+  --set grafana.enabled=true \
+  --set kiali.contextPath=/ \
+  --set kiali.createDemoSecret=true \
+  --set kiali.dashboard.grafanaURL=http://grafana.${MY_DOMAIN}/ \
+  --set kiali.dashboard.jaegerURL=http://jaeger.${MY_DOMAIN}/ \
+  --set kiali.enabled=true \
+  --set kiali.prometheusAddr=http://prometheus-system-np.knative-monitoring.svc.cluster.local:8080 \
+  --set mixer.adapters.prometheus.enabled=false \
+  --set pilot.traceSampling=100 \
+  --set prometheus.enabled=false \
+  --set sidecarInjectorWebhook.enableNamespacesByDefault=true \
+  --set sidecarInjectorWebhook.enabled=true \
+  --set tracing.enabled=true
+

Output:

NAME: istio
+LAST DEPLOYED: Fri Dec 27 10:50:54 2019
+NAMESPACE: istio-system
+STATUS: deployed
+REVISION: 1
+TEST SUITE: None
+NOTES:
+Thank you for installing Istio.
+
+Your release is named Istio.
+
+To get started running application with Istio, execute the following steps:
+1. Label namespace that application object will be deployed to by the following command (take default namespace as an example)
+
+  kubectl label namespace default istio-injection=enabled
+  kubectl get namespace -L istio-injection
+
+2. Deploy your applications
+
+  kubectl apply -f &lt;your-application>.yaml
+
+For more information on running Istio, visit:
+https://istio.io/
+

Let istio-ingressgateway to use cert-manager generated certificate via +SDS (opens new window). +Steps are taken from this URL: https://istio.io/docs/tasks/traffic-management/ingress/ingress-certmgr/ (opens new window).

kubectl -n istio-system patch gateway istio-autogenerated-k8s-ingress \
+  --type=json \
+  -p="[{"op": "replace", "path": "/spec/servers/1/tls", "value": {"credentialName": "ingress-cert-${LETSENCRYPT_ENVIRONMENT}", "mode": "SIMPLE", "privateKey": "sds", "serverCertificate": "sds"}}]"
+

Disable HTTP2 for gateway istio-autogenerated-k8s-ingress to be compatible +with Knative:

kubectl -n istio-system patch gateway istio-autogenerated-k8s-ingress --type=json \
+  -p="[{"op": "replace", "path": "/spec/servers/0/port", "value": {"name": "http", "number": "80", "protocol": "HTTP"}}]"
+

Allow the default namespace to use Istio injection:

kubectl label namespace default istio-injection=enabled
+

Configure the Istio services Jaeger (opens new window) and +Kiali (opens new window) to be visible externally:

cat << EOF | kubectl apply -f -
+apiVersion: networking.istio.io/v1alpha3
+kind: Gateway
+metadata:
+  name: istio-services-gateway
+  namespace: istio-system
+spec:
+  selector:
+    istio: ingressgateway
+  servers:
+  - port:
+      number: 80
+      name: http-istio-services
+      protocol: HTTP
+    hosts:
+    - grafana-istio.${MY_DOMAIN}
+    - jaeger-istio.${MY_DOMAIN}
+    - kiali-istio.${MY_DOMAIN}
+  - port:
+      number: 443
+      name: https-istio-services
+      protocol: HTTPS
+    hosts:
+    - grafana-istio.${MY_DOMAIN}
+    - jaeger-istio.${MY_DOMAIN}
+    - kiali-istio.${MY_DOMAIN}
+    tls:
+      credentialName: ingress-cert-${LETSENCRYPT_ENVIRONMENT}
+      mode: SIMPLE
+      privateKey: sds
+      serverCertificate: sds
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: grafana-istio-virtual-service
+  namespace: istio-system
+spec:
+  hosts:
+  - grafana-istio.${MY_DOMAIN}
+  gateways:
+  - istio-services-gateway
+  http:
+  - route:
+    - destination:
+        host: grafana.istio-system.svc.cluster.local
+        port:
+          number: 3000
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: jaeger-istio-virtual-service
+  namespace: istio-system
+spec:
+  hosts:
+  - jaeger-istio.${MY_DOMAIN}
+  gateways:
+  - istio-services-gateway
+  http:
+  - route:
+    - destination:
+        host: tracing.istio-system.svc.cluster.local
+        port:
+          number: 80
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: kiali-istio-virtual-service
+  namespace: istio-system
+spec:
+  hosts:
+  - kiali-istio.${MY_DOMAIN}
+  gateways:
+  - istio-services-gateway
+  http:
+  - route:
+    - destination:
+        host: kiali.istio-system.svc.cluster.local
+        port:
+          number: 20001
+EOF
+

# Create DNS records

Install external-dns (opens new window) and +let it manage mylabs.dev entries in Route 53 (Do not upgrade external-dns, +because it's not backward compatible and using different way of authentication +to Route53 using roles):

kubectl create namespace external-dns
+helm install external-dns stable/external-dns --namespace external-dns --version 2.10.1 --wait \
+  --set aws.credentials.accessKey="${USER_AWS_ACCESS_KEY_ID}" \
+  --set aws.credentials.secretKey="${USER_AWS_SECRET_ACCESS_KEY}" \
+  --set aws.region=eu-central-1 \
+  --set domainFilters={${MY_DOMAIN}} \
+  --set istioIngressGateways={istio-system/istio-ingressgateway} \
+  --set interval="10s" \
+  --set policy="sync" \
+  --set rbac.create=true \
+  --set sources="{istio-gateway,service}" \
+  --set txtOwnerId="${USER}-k8s.${MY_DOMAIN}"
+

Output:

namespace/external-dns created
+NAME: external-dns
+LAST DEPLOYED: Fri Dec 27 10:53:29 2019
+NAMESPACE: external-dns
+STATUS: deployed
+REVISION: 1
+TEST SUITE: None
+NOTES:
+** Please be patient while the chart is being deployed **
+
+To verify that external-dns has started, run:
+
+  kubectl --namespace=external-dns get pods -l "app.kubernetes.io/name=external-dns,app.kubernetes.io/instance=external-dns"
+

Architecture

You should be able to reach these URLs:

+ + + diff --git a/part-04/index.html b/part-04/index.html new file mode 100644 index 0000000..9d1e6cf --- /dev/null +++ b/part-04/index.html @@ -0,0 +1,196 @@ + + + + + + Install Harbor | Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

# Install Harbor

Harbor logo

Label Harbor namespace and copy there the secret with certificates signed by +Let's Encrypt certificate:

kubectl create namespace harbor
+kubectl label namespace harbor app=kubed
+

Create Istio Gateways and VirtualServices to allow accessing Harbor from +"outside":

cat << EOF | kubectl apply -f -
+apiVersion: networking.istio.io/v1alpha3
+kind: Gateway
+metadata:
+  name: harbor-gateway
+  namespace: harbor
+spec:
+  selector:
+    istio: ingressgateway
+  servers:
+  - port:
+      number: 80
+      name: http-harbor
+      protocol: HTTP
+    hosts:
+    - harbor.${MY_DOMAIN}
+  - port:
+      number: 443
+      name: https-harbor
+      protocol: HTTPS
+    hosts:
+    - harbor.${MY_DOMAIN}
+    - notary.${MY_DOMAIN}
+    tls:
+      mode: PASSTHROUGH
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: harbor-http-virtual-service
+  namespace: harbor
+spec:
+  hosts:
+  - harbor.${MY_DOMAIN}
+  gateways:
+  - harbor-gateway
+  http:
+  - match:
+    - port: 80
+    route:
+    - destination:
+        host: harbor.harbor.svc.cluster.local
+        port:
+          number: 80
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: harbor-https-virtual-service
+  namespace: harbor
+spec:
+  hosts:
+  - harbor.${MY_DOMAIN}
+  gateways:
+  - harbor-gateway
+  tls:
+  - match:
+    - port: 443
+      sniHosts:
+      - harbor.${MY_DOMAIN}
+    route:
+    - destination:
+        host: harbor.harbor.svc.cluster.local
+        port:
+          number: 443
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: harbor-notary-virtual-service
+  namespace: harbor
+spec:
+  hosts:
+  - notary.${MY_DOMAIN}
+  gateways:
+  - harbor-gateway
+  tls:
+  - match:
+    - port: 443
+      sniHosts:
+      - notary.${MY_DOMAIN}
+    route:
+    - destination:
+        host: harbor.harbor.svc.cluster.local
+        port:
+          number: 4443
+EOF
+

Add Harbor Helm repository:

helm repo add harbor https://helm.goharbor.io
+helm repo update
+

Install Harbor using Helm:

helm install harbor harbor/harbor --namespace harbor --version v1.2.3 --wait \
+  --set expose.tls.enabled=true \
+  --set expose.tls.secretName=ingress-cert-${LETSENCRYPT_ENVIRONMENT} \
+  --set expose.type=clusterIP \
+  --set externalURL=https://harbor.${MY_DOMAIN} \
+  --set harborAdminPassword=admin \
+  --set persistence.enabled=false
+

Output:

NAME: harbor
+LAST DEPLOYED: Fri Dec 27 10:54:23 2019
+NAMESPACE: harbor
+STATUS: deployed
+REVISION: 1
+TEST SUITE: None
+NOTES:
+Please wait for several minutes for Harbor deployment to complete.
+Then you should be able to visit the Harbor portal at https://harbor.mylabs.dev.
+For more details, please visit https://github.com/goharbor/harbor.
+

Open the https://harbor.mylabs.dev (opens new window):

Harbor login page

Log in:

  • User: admin
  • Password: admin

You should see the Web UI:

Harbor

Create new robot account for library project:

HARBOR_ROBOT_TOKEN=$(curl -s -k -u "admin:admin" -X POST -H "Content-Type: application/json" "https://harbor.${MY_DOMAIN}/api/projects/1/robots" -d \
+"{
+  \"name\": \"myrobot\",
+  \"description\": \"Robot account with Push/Pull access to library project\",
+  \"access\": [
+    {
+      \"resource\": \"/project/1/repository\",
+      \"action\": \"push\"
+    }
+  ]
+}" | jq -r ".token")
+echo ${HARBOR_ROBOT_TOKEN}
+

Output:

eyJhbGciO .... oOFJvwidsQ
+

Enable automated vulnerability scan after each "image push" to the project +library:

curl -s -k -u "admin:admin" -X PUT "https://harbor.${MY_DOMAIN}/api/projects/1" -H  "Content-Type: application/json" -d \
+"{
+  \"metadata\": {
+    \"auto_scan\": \"true\"
+  }
+}"
+

Test Harbor functionality by uploading docker image (optional):

if [ ${LETSENCRYPT_ENVIRONMENT} = "staging" ]; then
+  export SSL_CERT_FILE=$PWD/tmp/fakelerootx1.pem
+fi
+
+docker pull gcr.io/kuar-demo/kuard-amd64:blue
+
+docker tag gcr.io/kuar-demo/kuard-amd64:blue harbor.${MY_DOMAIN}/library/kuard-amd64:blue
+echo $HARBOR_ROBOT_TOKEN | docker login --username "robot\$myrobot" --password-stdin harbor.${MY_DOMAIN}
+docker push harbor.${MY_DOMAIN}/library/kuard-amd64:blue
+
+docker tag gcr.io/kuar-demo/kuard-amd64:blue harbor.${MY_DOMAIN}/library/kuard-amd64:blue2
+echo admin | docker login --username admin --password-stdin harbor.${MY_DOMAIN}
+export DOCKER_CONTENT_TRUST=1
+export DOCKER_CONTENT_TRUST_SERVER=https://notary.${MY_DOMAIN}
+export DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE="mypassphrase123"
+export DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE="rootpassphrase123"
+docker push harbor.${MY_DOMAIN}/library/kuard-amd64:blue2
+
+unset DOCKER_CONTENT_TRUST
+unset SSL_CERT_FILE
+
+ + + diff --git a/part-05/index.html b/part-05/index.html new file mode 100644 index 0000000..c8660c1 --- /dev/null +++ b/part-05/index.html @@ -0,0 +1,324 @@ + + + + + + Install GitLab | Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

# Install GitLab

Add GitLab repository:

helm repo add gitlab https://charts.gitlab.io/
+helm repo update
+

Create gitlab namespaces with secrets needed for GitLab +(certificates and passwords):

kubectl create namespace gitlab
+kubectl create secret generic gitlab-initial-root-password --from-literal=password="admin123" -n gitlab
+kubectl create secret generic custom-ca --from-file=unique_name=tmp/fakelerootx1.pem -n gitlab
+

Create Istio Gateways and VirtualServices to allow accessing GitLab from +"outside":

cat << EOF | kubectl apply -f -
+apiVersion: networking.istio.io/v1alpha3
+kind: Gateway
+metadata:
+  name: gitlab-gateway
+  namespace: gitlab
+spec:
+  selector:
+    istio: ingressgateway
+  servers:
+  - port:
+      number: 22
+      name: ssh-gitlab
+      protocol: TCP
+    hosts:
+    - gitlab.${MY_DOMAIN}
+  - port:
+      number: 80
+      name: http-gitlab
+      protocol: HTTP
+    hosts:
+    - gitlab.${MY_DOMAIN}
+    - minio.${MY_DOMAIN}
+    tls:
+      httpsRedirect: true
+  - port:
+      number: 443
+      name: https-gitlab
+      protocol: HTTPS
+    hosts:
+    - gitlab.${MY_DOMAIN}
+    - minio.${MY_DOMAIN}
+    tls:
+      credentialName: ingress-cert-${LETSENCRYPT_ENVIRONMENT}
+      mode: SIMPLE
+      privateKey: sds
+      serverCertificate: sds
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: gitlab-ssh-virtual-service
+  namespace: gitlab
+spec:
+  hosts:
+  - gitlab.${MY_DOMAIN}
+  gateways:
+  - gitlab-gateway
+  tcp:
+  - match:
+    - port: 22
+    route:
+    - destination:
+        host: gitlab-gitlab-shell.gitlab.svc.cluster.local
+        port:
+          number: 22
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: gitlab-http-virtual-service
+  namespace: gitlab
+spec:
+  hosts:
+  - gitlab.${MY_DOMAIN}
+  gateways:
+  - gitlab-gateway
+  http:
+  - match:
+    - uri:
+        prefix: /admin/sidekiq
+    route:
+    - destination:
+        host: gitlab-unicorn.gitlab.svc.cluster.local
+        port:
+          number: 8080
+  - route:
+    - destination:
+        host: gitlab-unicorn.gitlab.svc.cluster.local
+        port:
+          number: 8181
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: gitlab-minio-virtual-service
+  namespace: gitlab
+spec:
+  hosts:
+  - minio.${MY_DOMAIN}
+  gateways:
+  - gitlab-gateway
+  http:
+  - route:
+    - destination:
+        host: gitlab-minio-svc.gitlab.svc.cluster.local
+        port:
+          number: 9000
+EOF
+

Install GitLab using Helm:

helm install gitlab gitlab/gitlab --namespace gitlab --wait --version 2.6.0 \
+  --set certmanager.install=false \
+  --set gitlab-runner.install=false \
+  --set gitlab.gitaly.persistence.size=1Gi \
+  --set gitlab.unicorn.ingress.enabled=false \
+  --set global.appConfig.cron_jobs.ci_archive_traces_cron_worker.cron="17 * * * *" \
+  --set global.appConfig.cron_jobs.expire_build_artifacts_worker.cron="50 * * * *" \
+  --set global.appConfig.cron_jobs.pipeline_schedule_worker.cron="19 * * * *" \
+  --set global.appConfig.cron_jobs.repository_archive_cache_worker.cron="0 * * * *" \
+  --set global.appConfig.cron_jobs.repository_check_worker.cron="20 * * * *" \
+  --set global.appConfig.cron_jobs.stuck_ci_jobs_worker.cron="0 * * * *" \
+  --set global.appConfig.gravatar.plainUrl="https://www.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon" \
+  --set global.appConfig.gravatar.sslUrl="https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon" \
+  --set global.certificates.customCAs[0].secret=custom-ca \
+  --set global.edition=ce \
+  --set global.hosts.domain=${MY_DOMAIN} \
+  --set global.ingress.configureCertmanager=false \
+  --set global.ingress.enabled=false \
+  --set global.initialRootPassword.secret=gitlab-initial-root-password \
+  --set minio.persistence.size=5Gi \
+  --set nginx-ingress.enabled=false \
+  --set postgresql.persistence.size=1Gi \
+  --set prometheus.install=false \
+  --set redis.persistence.size=1Gi \
+  --set registry.enabled=false
+

Output:

NAME: gitlab
+LAST DEPLOYED: Fri Dec 27 10:57:01 2019
+NAMESPACE: gitlab
+STATUS: deployed
+REVISION: 1
+NOTES:
+WARNING: Automatic TLS certificate generation with cert-manager is disabled and no TLS certificates were provided. Self-signed certificates were generated.
+
+You may retrieve the CA root for these certificates from the `gitlab-wildcard-tls-ca` secret, via the following command. It can then be imported to a web browser or system store.
+
+    kubectl get secret gitlab-wildcard-tls-ca -ojsonpath='{.data.cfssl_ca}' | base64 --decode > gitlab.mylabs.dev.ca.pem
+
+If you do not wish to use self-signed certificates, please set the following properties:
+  - global.ingress.tls.secretName
+  OR
+  - gitlab.unicorn.ingress.tls.secretName
+  - minio.ingress.tls.secretName
+

Try to access the GitLab using the URL https://gitlab.mylabs.dev (opens new window) +with following credentials:

  • Username: root
  • Password: admin123

Create Personal Access Token 1234567890 for user root:

UNICORN_POD=$(kubectl get pods -n gitlab -l=app=unicorn -o jsonpath="{.items[0].metadata.name}")
+echo ${UNICORN_POD}
+kubectl exec -n gitlab -it $UNICORN_POD -c unicorn -- /bin/bash -c "
+cd /srv/gitlab;
+bin/rails r \"
+token_digest = Gitlab::CryptoHelper.sha256 \\\"1234567890\\\";
+token=PersonalAccessToken.create!(name: \\\"Full Access\\\", scopes: [:api], user: User.where(id: 1).first, token_digest: token_digest);
+token.save!
+\";
+"
+

Output:

gitlab-unicorn-566c465dc4-4dwdz
+

Create new user myuser:

GITLAB_USER_ID=$(curl -s -k -X POST -H "Content-type: application/json" -H "PRIVATE-TOKEN: 1234567890" https://gitlab.${MY_DOMAIN}/api/v4/users -d \
+"{
+  \"name\": \"myuser\",
+  \"username\": \"myuser\",
+  \"password\": \"myuser_password\",
+  \"email\": \"myuser@${MY_DOMAIN}\",
+  \"skip_confirmation\": true
+}" | jq ".id")
+echo ${GITLAB_USER_ID}
+

Output:

2
+

Create a personal access token for user myuser:

kubectl exec -n gitlab -it $UNICORN_POD -c unicorn -- /bin/bash -c "
+cd /srv/gitlab;
+bin/rails r \"
+token_digest = Gitlab::CryptoHelper.sha256 \\\"0987654321\\\";
+token=PersonalAccessToken.create!(name: \\\"Full Access\\\", scopes: [:api], user: User.where(id: ${GITLAB_USER_ID}).first, token_digest: token_digest);
+token.save!
+\";
+"
+

Create Impersonation token for myuser:

GILAB_MYUSER_TOKEN=$(curl -s -k -X POST -H "Content-type: application/json" -H "PRIVATE-TOKEN: 1234567890" https://gitlab.${MY_DOMAIN}/api/v4/users/${GITLAB_USER_ID}/impersonation_tokens -d \
+"{
+  \"name\": \"mytoken\",
+  \"scopes\": [\"api\"]
+}" | jq -r ".token")
+echo ${GILAB_MYUSER_TOKEN}
+

Output:

t_dJwRNpVkdsxWzs3Yv3
+

Create SSH key which will be imported to GitLab:

ssh-keygen -t ed25519 -f tmp/id_rsa_gitlab -q -N "" -C "my_ssh_key@mylabs.dev"
+

Add ssh key to the myuser:

curl -sk -X POST -F "private_token=${GILAB_MYUSER_TOKEN}" https://gitlab.${MY_DOMAIN}/api/v4/user/keys -F "title=my_ssh_key" -F "key=$(cat tmp/id_rsa_gitlab.pub)" | jq
+

Output:

{
+  "id": 1,
+  "title": "my_ssh_key",
+  "key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKH2+gqsWrziaAmzGumc/frT0EBMSrXSP0MT/jRcKwtm my_ssh_key@mylabs.dev",
+  "created_at": "2019-12-27T10:01:45.403Z"
+}
+

Create new project:

PROJECT_ID=$(curl -s -k -X POST -H "Content-type: application/json" -H "PRIVATE-TOKEN: 1234567890" https://gitlab.${MY_DOMAIN}/api/v4/projects/user/${GITLAB_USER_ID} -d \
+"{
+  \"user_id\": \"${GITLAB_USER_ID}\",
+  \"name\": \"my-podinfo\",
+  \"description\": \"My Test Project\",
+  \"wiki_access_level\": \"disabled\",
+  \"issues_access_level\": \"disabled\",
+  \"builds_access_level\": \"disabled\",
+  \"snippets_access_level\": \"disabled\",
+  \"container-registry-enabled\": false,
+  \"visibility\": \"public\"
+}" | jq -r ".id")
+echo ${PROJECT_ID}
+

Output:

1
+

Clone the podinfo (opens new window) project and push +it to the newly created git repository my-podinfo:

export GIT_SSH_COMMAND="ssh -i $PWD/tmp/id_rsa_gitlab -o UserKnownHostsFile=/dev/null"
+git clone --bare https://github.com/stefanprodan/podinfo tmp/podinfo
+git -C tmp/podinfo push --mirror git@gitlab.${MY_DOMAIN}:myuser/my-podinfo.git
+rm -rf tmp/podinfo
+

Output:

loning into bare repository 'tmp/podinfo'...
+remote: Enumerating objects: 10, done.
+remote: Counting objects: 100% (10/10), done.
+remote: Compressing objects: 100% (10/10), done.
+remote: Total 5266 (delta 0), reused 3 (delta 0), pack-reused 5256
+Receiving objects: 100% (5266/5266), 9.52 MiB | 1.28 MiB/s, done.
+Resolving deltas: 100% (2342/2342), done.
+Warning: Permanently added 'gitlab.mylabs.dev,18.184.227.16' (ECDSA) to the list of known hosts.
+Enumerating objects: 5266, done.
+Counting objects: 100% (5266/5266), done.
+Delta compression using up to 4 threads
+Compressing objects: 100% (2544/2544), done.
+Writing objects: 100% (5266/5266), 9.52 MiB | 6.95 MiB/s, done.
+Total 5266 (delta 2342), reused 5266 (delta 2342)
+remote: Resolving deltas: 100% (2342/2342), done.
+remote:
+remote: To create a merge request for gh-pages, visit:
+remote:   https://gitlab.mylabs.dev/myuser/my-podinfo/merge_requests/new?merge_request%5Bsource_branch%5D=gh-pages
+remote:
+remote: To create a merge request for v0.x, visit:
+remote:   https://gitlab.mylabs.dev/myuser/my-podinfo/merge_requests/new?merge_request%5Bsource_branch%5D=v0.x
+remote:
+remote: To create a merge request for v1.x, visit:
+remote:   https://gitlab.mylabs.dev/myuser/my-podinfo/merge_requests/new?merge_request%5Bsource_branch%5D=v1.x
+remote:
+remote: To create a merge request for v3.x, visit:
+remote:   https://gitlab.mylabs.dev/myuser/my-podinfo/merge_requests/new?merge_request%5Bsource_branch%5D=v3.x
+remote:
+To gitlab.mylabs.dev:myuser/my-podinfo.git
+ * [new branch]      gh-pages -> gh-pages
+ * [new branch]      master -> master
+ * [new branch]      v0.x -> v0.x
+ * [new branch]      v1.x -> v1.x
+ * [new branch]      v3.x -> v3.x
+ * [new tag]         0.2.2 -> 0.2.2
+ * [new tag]         2.0.0 -> 2.0.0
+ * [new tag]         2.0.1 -> 2.0.1
+ * [new tag]         2.0.2 -> 2.0.2
+ * [new tag]         2.1.0 -> 2.1.0
+ * [new tag]         2.1.1 -> 2.1.1
+ * [new tag]         2.1.2 -> 2.1.2
+ * [new tag]         2.1.3 -> 2.1.3
+ * [new tag]         3.0.0 -> 3.0.0
+ * [new tag]         3.1.0 -> 3.1.0
+ * [new tag]         3.1.1 -> 3.1.1
+ * [new tag]         3.1.2 -> 3.1.2
+ * [new tag]         3.1.3 -> 3.1.3
+ * [new tag]         3.1.4 -> 3.1.4
+ * [new tag]         3.1.5 -> 3.1.5
+ * [new tag]         flux-floral-pine-16 -> flux-floral-pine-16
+ * [new tag]         flux-thawing-star-34 -> flux-thawing-star-34
+ * [new tag]         v0.4.0 -> v0.4.0
+ * [new tag]         v0.5.0 -> v0.5.0
+ * [new tag]         v1.0.0 -> v1.0.0
+ * [new tag]         v1.1.0 -> v1.1.0
+ * [new tag]         v1.1.1 -> v1.1.1
+ * [new tag]         v1.2.0 -> v1.2.0
+ * [new tag]         v1.2.1 -> v1.2.1
+ * [new tag]         v1.3.0 -> v1.3.0
+ * [new tag]         v1.3.1 -> v1.3.1
+ * [new tag]         v1.4.0 -> v1.4.0
+ * [new tag]         v1.4.1 -> v1.4.1
+ * [new tag]         v1.4.2 -> v1.4.2
+ * [new tag]         v1.6.0 -> v1.6.0
+ * [new tag]         v1.7.0 -> v1.7.0
+ * [new tag]         v1.8.0 -> v1.8.0
+

GitLab Screenshot:

GitLab

+ + + diff --git a/part-06/index.html b/part-06/index.html new file mode 100644 index 0000000..2a1c74f --- /dev/null +++ b/part-06/index.html @@ -0,0 +1,212 @@ + + + + + + Install Knative | Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

# Install Knative

Set Knative version variable:

export KNATIVE_VERSION="v0.11.0"
+

Install Knative:

kubectl apply --selector knative.dev/crd-install=true \
+   --filename https://github.com/knative/serving/releases/download/${KNATIVE_VERSION}/serving.yaml \
+   --filename https://github.com/knative/eventing/releases/download/${KNATIVE_VERSION}/release.yaml \
+   --filename https://github.com/knative/serving/releases/download/${KNATIVE_VERSION}/monitoring.yaml
+kubectl apply \
+   --filename https://github.com/knative/serving/releases/download/${KNATIVE_VERSION}/serving.yaml \
+   --filename https://github.com/knative/eventing/releases/download/${KNATIVE_VERSION}/release.yaml \
+   --filename https://github.com/knative/serving/releases/download/${KNATIVE_VERSION}/monitoring.yaml
+sleep 60
+

Install Tekton with Dashboard (do not increase Tekton version above 0.8.0):

kubectl apply --filename https://github.com/tektoncd/pipeline/releases/download/v0.8.0/release.yaml
+kubectl apply --filename https://github.com/tektoncd/dashboard/releases/download/v0.3.0/dashboard-latest-release.yaml
+

Install Tekton Triggers:

kubectl apply --filename https://github.com/tektoncd/triggers/releases/download/v0.1.0/release.yaml
+

Export Knative services (Prometheus (opens new window) and +Grafana (opens new window)) to be visible externally:

cat << EOF | kubectl apply -f -
+apiVersion: networking.istio.io/v1alpha3
+kind: Gateway
+metadata:
+  name: knative-services-gateway
+  namespace: knative-monitoring
+spec:
+  selector:
+    istio: ingressgateway
+  servers:
+  - port:
+      number: 80
+      name: http-knative-services
+      protocol: HTTP
+    hosts:
+    - knative-grafana.${MY_DOMAIN}
+    - knative-prometheus.${MY_DOMAIN}
+    - knative-tekton.${MY_DOMAIN}
+  - port:
+      number: 443
+      name: https-knative-services
+      protocol: HTTPS
+    hosts:
+    - knative-grafana.${MY_DOMAIN}
+    - knative-prometheus.${MY_DOMAIN}
+    - knative-tekton.${MY_DOMAIN}
+    tls:
+      credentialName: ingress-cert-${LETSENCRYPT_ENVIRONMENT}
+      mode: SIMPLE
+      privateKey: sds
+      serverCertificate: sds
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: grafana-virtual-service
+  namespace: knative-monitoring
+spec:
+  hosts:
+  - "knative-grafana.${MY_DOMAIN}"
+  gateways:
+  - knative-services-gateway
+  http:
+  - route:
+    - destination:
+        host: grafana.knative-monitoring.svc.cluster.local
+        port:
+          number: 30802
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: prometheus-virtual-service
+  namespace: knative-monitoring
+spec:
+  hosts:
+  - "knative-prometheus.${MY_DOMAIN}"
+  gateways:
+  - knative-services-gateway
+  http:
+  - route:
+    - destination:
+        host: prometheus-system-np.knative-monitoring.svc.cluster.local
+        port:
+          number: 8080
+---
+apiVersion: networking.istio.io/v1alpha3
+kind: VirtualService
+metadata:
+  name: tekton-virtual-service
+  namespace: knative-monitoring
+spec:
+  hosts:
+  - "knative-tekton.${MY_DOMAIN}"
+  gateways:
+  - knative-services-gateway
+  http:
+  - route:
+    - destination:
+        host: tekton-dashboard.tekton-pipelines.svc.cluster.local
+        port:
+          number: 9097
+EOF
+

Tekton Dashboard:

Tekton Dashboard

Set up a custom domain for Knative:

cat << EOF | kubectl apply -f -
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: config-domain
+  namespace: knative-serving
+data:
+  ${MY_DOMAIN}: ""
+EOF
+

Changing the controller deployment is needed if you are not using the valid +certificates (self-signed):

if [ ${LETSENCRYPT_ENVIRONMENT} = "staging" ]; then
+  kubectl --namespace knative-serving create secret generic customca --from-file=customca.crt=tmp/fakelerootx1.pem
+  kubectl patch deployment controller --namespace knative-serving --patch "
+    {
+        \"spec\": {
+            \"template\": {
+                \"spec\": {
+                    \"containers\": [{
+                        \"env\": [{
+                            \"name\": \"SSL_CERT_DIR\",
+                            \"value\": \"/etc/customca\"
+                        }],
+                        \"name\": \"controller\",
+                        \"volumeMounts\": [{
+                            \"mountPath\": \"/etc/customca\",
+                            \"name\": \"customca\"
+                        }]
+                    }],
+                    \"volumes\": [{
+                        \"name\": \"customca\",
+                        \"secret\": {
+                            \"defaultMode\": 420,
+                            \"secretName\": \"customca\"
+                        }
+                    }]
+                }
+            }
+        }
+    }"
+fi
+

# Enable automatic TLS certificate provisioning for Knative

Install networking-certmanager:

kubectl apply --filename https://github.com/knative/serving/releases/download/${KNATIVE_VERSION}/serving-cert-manager.yaml
+

Update your config-certmanager ConfigMap in the knative-serving namespace to +define your new ClusterIssuer configuration and your your DNS provider:

cat << EOF | kubectl apply -f -
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: config-certmanager
+  namespace: knative-serving
+  labels:
+    networking.knative.dev/certificate-provider: cert-manager
+data:
+  issuerRef: |
+    kind: ClusterIssuer
+    name: letsencrypt-${LETSENCRYPT_ENVIRONMENT}-dns
+  solverConfig: |
+    dns01:
+      provider: aws-route53
+EOF
+

Update the config-network ConfigMap in the knative-serving namespace to enable +autoTLS:

cat << EOF | kubectl apply -f -
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: config-network
+  namespace: knative-serving
+data:
+  autoTLS: Enabled
+  httpProtocol: Enabled
+EOF
+
+ + + diff --git a/part-07/index.html b/part-07/index.html new file mode 100644 index 0000000..aa2ca29 --- /dev/null +++ b/part-07/index.html @@ -0,0 +1,282 @@ + + + + + + Build and run container image using Knative + Tekton | Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

# Build and run container image using Knative + Tekton

Set the necessary variables:

export GIT_REPOSITORY="git@gitlab.${MY_DOMAIN}:myuser/my-podinfo.git"
+export GIT_REVISION="3.1.0"
+export GIT_REPO_SSH_KEY="tmp/id_rsa_gitlab"
+export CONTAINER_REGISTRY="harbor.${MY_DOMAIN}/library/my-podinfo"
+export CONTAINER_REGISTRY_USERNAME="robot\$myrobot"
+export CONTAINER_REGISTRY_PASSWORD="${HARBOR_ROBOT_TOKEN}"
+
+export GIT_PROJECT_NAME=$( echo ${GIT_REPOSITORY} | sed "s@.*/\(.*\).git@\1@; s/\./\-/" )
+export CONTAINER_REGISTRY_SERVER=$( echo $CONTAINER_REGISTRY | awk -F / "{ print \$1 }" )
+export CONTAINER_REGISTRY_SERVER_MODIFIED=$( echo $CONTAINER_REGISTRY | awk -F / "{ gsub(/\./,\"-\"); print \$1 }" )
+export GIT_SSH_SERVER=$( echo $GIT_REPOSITORY | awk -F "[@:]" "{ print \$2}" )
+export GIT_SSH_SERVER_MODIFIED=$( echo $GIT_REPOSITORY | awk -F "[@:]" "{ gsub(/\./,\"-\"); print \$2 }" )
+

Create secret for Harbor registry to let Tekton pipeline to upload the container +image:

kubectl create secret docker-registry ${CONTAINER_REGISTRY_SERVER_MODIFIED}-docker-config \
+  --docker-server="${CONTAINER_REGISTRY_SERVER}" \
+  --docker-username="${CONTAINER_REGISTRY_USERNAME}" \
+  --docker-password="${CONTAINER_REGISTRY_PASSWORD}"
+

Create secret for AWS user to allow Tekton pipeline to push binary to S3:

kubectl create secret generic user-aws-access-keys --from-literal=access_key=$USER_AWS_ACCESS_KEY_ID --from-literal=secret_key=$USER_AWS_SECRET_ACCESS_KEY
+

Create + start Tekton pipeline (and it's components) to build the container +image:

cat << EOF | kubectl apply -f -
+apiVersion: v1
+kind: Secret
+type: kubernetes.io/ssh-auth
+metadata:
+  name: ${GIT_SSH_SERVER_MODIFIED}-ssh-key
+  annotations:
+    tekton.dev/git-0: ${GIT_SSH_SERVER}
+data:
+  ssh-privatekey: $(base64 -w 0 ${GIT_REPO_SSH_KEY})
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: ${GIT_SSH_SERVER_MODIFIED}-build-bot
+secrets:
+  - name: ${GIT_SSH_SERVER_MODIFIED}-ssh-key
+---
+apiVersion: tekton.dev/v1alpha1
+kind: PipelineResource
+metadata:
+  name: ${GIT_PROJECT_NAME}-project-git
+  namespace: default
+spec:
+  type: git
+  params:
+    - name: url
+      value: ${GIT_REPOSITORY}
+    - name: revision
+      value: ${GIT_REVISION}
+---
+apiVersion: tekton.dev/v1alpha1
+kind: PipelineResource
+metadata:
+  name: ${GIT_PROJECT_NAME}-project-image
+spec:
+  type: image
+  params:
+    - name: url
+      value: ${CONTAINER_REGISTRY}:${GIT_REVISION}
+---
+apiVersion: tekton.dev/v1alpha1
+kind: Task
+metadata:
+  name: build-docker-image-from-git-task
+spec:
+  inputs:
+    resources:
+      - name: docker-source
+        type: git
+    params:
+      - name: pathToDockerFile
+        description: The path to the dockerfile to build
+        default: /workspace/docker-source/Dockerfile
+      - name: pathToContext
+        description:
+          The build context used by Kaniko
+          (https://github.com/GoogleContainerTools/kaniko#kaniko-build-contexts)
+        default: /workspace/docker-source
+  outputs:
+    resources:
+      - name: builtImage
+        type: image
+  volumes:
+    - name: docker-config
+      secret:
+        secretName: ${CONTAINER_REGISTRY_SERVER_MODIFIED}-docker-config
+        items:
+          - key: .dockerconfigjson
+            path: config.json
+    - name: shared-storage
+      emptyDir: {}
+  steps:
+    - name: build-and-tar
+      image: gcr.io/kaniko-project/executor
+      command:
+        - /kaniko/executor
+      args:
+        - --dockerfile=\$(inputs.params.pathToDockerFile)
+        - --destination=\$(outputs.resources.builtImage.url)
+        - --context=\$(inputs.params.pathToContext)
+        - --single-snapshot
+        - --tarPath=/shared-storage/${USER}-app-build.tar
+        - --no-push
+      volumeMounts:
+        - name: docker-config
+          mountPath: /builder/home/.docker/
+        - name: shared-storage
+          mountPath: /shared-storage
+    - name: upload-container-content-s3
+      image: atlassian/pipelines-awscli
+      command: ["sh", "-x", "-c", "ls -la /shared-storage/ ; aws s3 cp /shared-storage/${USER}-app-build.tar s3://${USER}-kops-k8s/"]
+      env:
+        - name: AWS_DEFAULT_REGION
+          value: "eu-central-1"
+        - name: AWS_ACCESS_KEY_ID
+          valueFrom:
+            secretKeyRef:
+              name: user-aws-access-keys
+              key: access_key
+        - name: AWS_SECRET_ACCESS_KEY
+          valueFrom:
+            secretKeyRef:
+              name: user-aws-access-keys
+              key: secret_key
+      volumeMounts:
+        - name: shared-storage
+          mountPath: /shared-storage
+    - name: build-and-push
+      image: gcr.io/kaniko-project/executor
+      env:
+        - name: "DOCKER_CONFIG"
+          value: "/builder/home/.docker/"
+      command:
+        - /kaniko/executor
+      args:
+        - --dockerfile=\$(inputs.params.pathToDockerFile)
+        - --destination=\$(outputs.resources.builtImage.url)
+        - --context=\$(inputs.params.pathToContext)
+        - --single-snapshot
+        - --skip-tls-verify
+      volumeMounts:
+        - name: docker-config
+          mountPath: /builder/home/.docker/
+---
+apiVersion: tekton.dev/v1alpha1
+kind: Pipeline
+metadata:
+  name: build-docker-image-from-git-pipeline
+spec:
+  resources:
+  - name: docker-source
+    type: git
+  - name: builtImage
+    type: image
+  tasks:
+  - name: build-docker-image-from-git-task-run
+    taskRef:
+      name: build-docker-image-from-git-task
+    params:
+    - name: pathToDockerFile
+      value: Dockerfile
+    - name: pathToContext
+      value: /workspace/docker-source/
+    resources:
+      inputs:
+      - name: docker-source
+        resource: docker-source
+      outputs:
+      - name: builtImage
+        resource: builtImage
+---
+apiVersion: tekton.dev/v1alpha1
+kind: PipelineRun
+metadata:
+  name: ${GIT_PROJECT_NAME}-build-docker-image-from-git-pipelinerun
+spec:
+  serviceAccount: ${GIT_SSH_SERVER_MODIFIED}-build-bot
+  pipelineRef:
+    name: build-docker-image-from-git-pipeline
+  resources:
+    - name: docker-source
+      resourceRef:
+        name: ${GIT_PROJECT_NAME}-project-git
+    - name: builtImage
+      resourceRef:
+        name: ${GIT_PROJECT_NAME}-project-image
+EOF
+sleep 5
+

Wait for container build process will complete:

kubectl wait --timeout=10m --for=condition=Succeeded pipelineruns/${GIT_PROJECT_NAME}-build-docker-image-from-git-pipelinerun
+

Output:

pipelinerun.tekton.dev/my-podinfo-build-docker-image-from-git-pipelinerun condition met
+

Start the application:

cat << EOF | kubectl apply -f -
+apiVersion: serving.knative.dev/v1alpha1
+kind: Service
+metadata:
+  name: my-podinfo
+  namespace: default
+spec:
+  template:
+    spec:
+      containers:
+        - image: ${CONTAINER_REGISTRY}:${GIT_REVISION}
+          ports:
+          - name: http1
+            containerPort: 9898
+EOF
+sleep 20
+

Check the status of the application:

kubectl get pod,ksvc,configuration,revision,route,deployment
+

Output:

NAME                                                                             READY   STATUS      RESTARTS   AGE
+pod/my-podinfo-build-docker-image-from-git-pipelinerun-build--msbcv-pod-d6861e   0/6     Completed   0          7m56s
+pod/my-podinfo-vpw78-deployment-bbb89db58-vmnhb                                  2/2     Running     0          21s
+
+NAME                                     URL                                    LATESTCREATED      LATESTREADY        READY   REASON
+service.serving.knative.dev/my-podinfo   http://my-podinfo.default.mylabs.dev   my-podinfo-vpw78   my-podinfo-vpw78   True
+
+NAME                                           LATESTCREATED      LATESTREADY        READY   REASON
+configuration.serving.knative.dev/my-podinfo   my-podinfo-vpw78   my-podinfo-vpw78   True
+
+NAME                                            CONFIG NAME   K8S SERVICE NAME   GENERATION   READY   REASON
+revision.serving.knative.dev/my-podinfo-vpw78   my-podinfo    my-podinfo-vpw78   1            True
+
+NAME                                   URL                                    READY   REASON
+route.serving.knative.dev/my-podinfo   http://my-podinfo.default.mylabs.dev   True
+
+NAME                                                READY   UP-TO-DATE   AVAILABLE   AGE
+deployment.extensions/my-podinfo-vpw78-deployment   1/1     1            1           21s
+

Open https://my-podinfo.default.mylabs.dev (opens new window) +to see the application:

When you close the web browser - after some time without handling traffic +the number of running pods should drop to zero:

kubectl get deployments,pods
+

Output:

NAME                                                READY   UP-TO-DATE   AVAILABLE   AGE
+deployment.extensions/my-podinfo-vpw78-deployment   1/1     1            1           22s
+
+NAME                                                                             READY   STATUS      RESTARTS   AGE
+pod/my-podinfo-build-docker-image-from-git-pipelinerun-build--msbcv-pod-d6861e   0/6     Completed   0          7m57s
+pod/my-podinfo-vpw78-deployment-bbb89db58-vmnhb                                  2/2     Running     0          22s
+

If you open the URL again the pod should be started again and application will +handle the traffic - this takes about 3 seconds.

You can try to open the web browser with the URL https://my-podinfo.default.mylabs.dev (opens new window) +again and test it.

podinfo

+ + + diff --git a/part-08/index.html b/part-08/index.html new file mode 100644 index 0000000..cc7ccd9 --- /dev/null +++ b/part-08/index.html @@ -0,0 +1,810 @@ + + + + + + Automated deployment with Tekton | Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

# Automated deployment with Tekton

Take a real example Podinfo (opens new window) +application and create full pipeline for it...

# Fork podinfo application

Fork the Podinfo (opens new window) repository +podinfo:

cd tmp
+hub clone "stefanprodan/podinfo"
+hub -C "podinfo" fork
+

Output:

Cloning into 'podinfo'...
+remote: Enumerating objects: 10, done.
+remote: Counting objects: 100% (10/10), done.
+remote: Compressing objects: 100% (10/10), done.
+remote: Total 5266 (delta 0), reused 3 (delta 0), pack-reused 5256
+Receiving objects: 100% (5266/5266), 9.52 MiB | 1.93 MiB/s, done.
+Resolving deltas: 100% (2342/2342), done.
+Updating ruzickap
+From https://github.com/stefanprodan/podinfo
+ * [new branch]      gh-pages   -> ruzickap/gh-pages
+ * [new branch]      master     -> ruzickap/master
+ * [new branch]      v0.x       -> ruzickap/v0.x
+ * [new branch]      v1.x       -> ruzickap/v1.x
+ * [new branch]      v3.x       -> ruzickap/v3.x
+new remote: ruzickap
+

# Create Tekton Triggers configuration

Create new namespace:

kubectl create namespace getting-started
+

Create the admin user, role and rolebinding:

cat << EOF | kubectl apply -f -
+kind: Role
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: tekton-triggers-admin
+  namespace: getting-started
+rules:
+- apiGroups:
+  - tekton.dev
+  resources:
+  - eventlisteners
+  - triggerbindings
+  - triggertemplates
+  - pipelineresources
+  verbs:
+  - get
+- apiGroups:
+  - tekton.dev
+  resources:
+  - pipelineruns
+  - pipelineresources
+  verbs:
+  - create
+- apiGroups:
+  - ""
+  resources:
+  - configmaps
+  verbs:
+  - get
+  - list
+  - watch
+- apiGroups:
+  - apps
+  resources:
+  - deployments
+  verbs:
+  - get
+  - list
+  - watch
+  - create
+  - patch
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: tekton-triggers-admin
+  namespace: getting-started
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: tekton-triggers-admin-binding
+  namespace: getting-started
+subjects:
+  - kind: ServiceAccount
+    name: tekton-triggers-admin
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: Role
+  name: tekton-triggers-admin
+EOF
+

Create the create-webhook user, role and rolebinding:

cat << EOF | kubectl apply -f -
+kind: Role
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: tekton-triggers-createwebhook
+  namespace: getting-started
+rules:
+- apiGroups:
+  - ""
+  resources:
+  - secrets
+  verbs:
+  - get
+  - list
+  - create
+  - update
+  - delete
+- apiGroups:
+  - tekton.dev
+  resources:
+  - eventlisteners
+  verbs:
+  - get
+  - list
+  - create
+  - update
+  - delete
+- apiGroups:
+  - networking.istio.io
+  resources:
+  - virtualservices
+  - gateways
+  verbs:
+  - create
+  - get
+  - list
+  - delete
+  - update
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: tekton-triggers-createwebhook
+  namespace: getting-started
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: tekton-triggers-createwebhook
+  namespace: getting-started
+subjects:
+  - kind: ServiceAccount
+    name: tekton-triggers-createwebhook
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: Role
+  name: tekton-triggers-createwebhook
+EOF
+

Create secret for Harbor registry to let Tekton pipeline to upload the container +image:

kubectl create secret docker-registry -n getting-started harbor-docker-config \
+  --docker-server="${CONTAINER_REGISTRY_SERVER}" \
+  --docker-username="${CONTAINER_REGISTRY_USERNAME}" \
+  --docker-password="${CONTAINER_REGISTRY_PASSWORD}"
+

Install the Pipeline:

cat << \EOF | kubectl apply -f -
+apiVersion: tekton.dev/v1alpha1
+kind: Task
+metadata:
+  name: build-docker-image-from-git-task
+  namespace: getting-started
+spec:
+  inputs:
+    resources:
+      - name: docker-source
+        type: git
+    params:
+      - name: pathToDockerFile
+        description: The path to the dockerfile to build
+        default: /workspace/docker-source/Dockerfile
+      - name: pathToContext
+        description:
+          The build context used by Kaniko
+          (https://github.com/GoogleContainerTools/kaniko#kaniko-build-contexts)
+        default: /workspace/docker-source
+  outputs:
+    resources:
+      - name: image-source
+        type: image
+  volumes:
+    - name: docker-config
+      secret:
+        secretName: harbor-docker-config
+        items:
+          - key: .dockerconfigjson
+            path: config.json
+    - name: shared-storage
+      emptyDir: {}
+  steps:
+    - name: build
+      image: gcr.io/kaniko-project/executor
+      env:
+        - name: "DOCKER_CONFIG"
+          value: "/builder/home/.docker/"
+      command:
+        - /kaniko/executor
+      args:
+        - --dockerfile=$(inputs.params.pathToDockerFile)
+        - --destination=$(outputs.resources.image-source.url)
+        - --context=$(inputs.params.pathToContext)
+        - --skip-tls-verify
+      volumeMounts:
+        - name: docker-config
+          mountPath: /builder/home/.docker/
+---
+apiVersion: tekton.dev/v1alpha1
+kind: Task
+metadata:
+  name: deploy-locally
+  namespace: getting-started
+spec:
+  inputs:
+    resources:
+      - name: image-source
+        type: image
+  outputs:
+    resources:
+    - name: event-to-sink
+      type: cloudEvent
+  steps:
+    - name: run-kubectl
+      image: lachlanevenson/k8s-kubectl:latest
+      command:
+      - sh
+      args:
+      - -ce
+      - |
+        set -ex
+        kubectl run podinfo --image $(inputs.resources.image-source.url) -o yaml --dry-run | kubectl apply -f -
+---
+apiVersion: tekton.dev/v1alpha1
+kind: Pipeline
+metadata:
+  name: getting-started-pipeline
+  namespace: getting-started
+spec:
+  resources:
+  - name: docker-source
+    type: git
+  - name: image-source
+    type: image
+  - name: event-to-sink
+    type: cloudEvent
+  tasks:
+    - name: build-docker-image-from-git-task-run
+      taskRef:
+        name: build-docker-image-from-git-task
+      params:
+      - name: pathToDockerFile
+        value: Dockerfile
+      - name: pathToContext
+        value: /workspace/docker-source/
+      resources:
+        inputs:
+        - name: docker-source
+          resource: docker-source
+        outputs:
+        - name: image-source
+          resource: image-source
+    - name: deploy-locally
+      taskRef:
+        name: deploy-locally
+      resources:
+        inputs:
+          - name: image-source
+            resource: image-source
+            from:
+              - build-docker-image-from-git-task-run
+        outputs:
+          - name: event-to-sink
+            resource: event-to-sink
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: event-display
+  namespace: getting-started
+  labels:
+    app: event-display
+spec:
+  type: ClusterIP
+  ports:
+    - name: listener
+      port: 8080
+      protocol: TCP
+  selector:
+    app: event-display
+---
+  apiVersion: v1
+  kind: Pod
+  metadata:
+    name: event-display
+    namespace: getting-started
+    labels:
+      name: event-display
+  spec:
+    hostname: event-display
+    containers:
+    - image: gcr.io/knative-releases/github.com/knative/eventing-sources/cmd/event_display
+      name: web
+EOF
+

Install the TriggerTemplate, TriggerBinding and EventListener:

cat << EOF | kubectl apply -f -
+apiVersion: tekton.dev/v1alpha1
+kind: TriggerTemplate
+metadata:
+  name: getting-started-triggertemplate
+  namespace: getting-started
+spec:
+  params:
+    - name: gitrevision
+      description: The git revision
+      default: master
+    - name: gitrepositoryurl
+      description: The git repository url
+    - name: image_registry_url
+      description: The container registry url
+    - name: namespace
+      description: The namespace to create the resources
+  resourcetemplates:
+    - apiVersion: tekton.dev/v1alpha1
+      kind: PipelineResource
+      metadata:
+        name: source-repo-\$(uid)
+        namespace: \$(params.namespace)
+      spec:
+        type: git
+        params:
+        - name: revision
+          value: \$(params.gitrevision)
+        - name: url
+          value: \$(params.gitrepositoryurl)
+    - apiVersion: tekton.dev/v1alpha1
+      kind: PipelineResource
+      metadata:
+        name: image-source-\$(uid)
+        namespace: \$(params.namespace)
+      spec:
+        type: image
+        params:
+          - name: url
+            value: \$(params.image_registry_url)
+    - apiVersion: tekton.dev/v1alpha1
+      kind: PipelineResource
+      metadata:
+        name: event-to-sink-\$(uid)
+        namespace: \$(params.namespace)
+      spec:
+        type: cloudEvent
+        params:
+          - name: targetURI
+            value: http://event-display.getting-started.svc.cluster.local
+    - apiVersion: tekton.dev/v1alpha1
+      kind: PipelineRun
+      metadata:
+        name: getting-started-pipeline-run-\$(uid)
+        namespace: \$(params.namespace)
+      spec:
+        serviceAccount: tekton-triggers-admin
+        pipelineRef:
+          name: getting-started-pipeline
+        resources:
+          - name: docker-source
+            resourceRef:
+              name: source-repo-\$(uid)
+          - name: image-source
+            resourceRef:
+              name: image-source-\$(uid)
+          - name: event-to-sink
+            resourceRef:
+              name: event-to-sink-\$(uid)
+---
+apiVersion: tekton.dev/v1alpha1
+kind: TriggerBinding
+metadata:
+  name: getting-started-pipelinebinding
+  namespace: getting-started
+spec:
+  params:
+    - name: gitrevision
+      value: \$(body.head_commit.id)
+    - name: namespace
+      value: getting-started
+    - name: gitrepositoryurl
+      value: "https://github.com/\$(body.repository.full_name)"
+    - name: image_registry_url
+      value: "harbor.${MY_DOMAIN}/library/\$(body.repository.name)"
+---
+apiVersion: tekton.dev/v1alpha1
+kind: EventListener
+metadata:
+  name: getting-started-listener
+  namespace: getting-started
+spec:
+  serviceAccountName: tekton-triggers-admin
+  triggers:
+    - binding:
+        name: getting-started-pipelinebinding
+      template:
+        name: getting-started-triggertemplate
+EOF
+

# Configure webhook

Create Task which will create Istio Gateway and VirtualService to handle +incoming webhook form GitHub:

cat << \EOF2 | kubectl apply -f -
+apiVersion: tekton.dev/v1alpha1
+kind: Task
+metadata:
+  name: create-istio-gateway-virtualservice
+  namespace: getting-started
+spec:
+  volumes:
+  - name: work
+    emptyDir: {}
+
+  inputs:
+    params:
+    - name: TLScredentialName
+      description: "Specify the secret with wildcard certificate"
+    - name: ExternalDomain
+      description: "The external domain for the EventListener"
+    - name: Service
+      description: "The name of the Service used in the VirtualService"
+    - name: ServicePort
+      description: "The service port that the VirtualService is being created on"
+
+  steps:
+  - name: create-istio-gateway-virtualservice
+    image: lachlanevenson/k8s-kubectl:latest
+    command:
+    - sh
+    args:
+    - -ce
+    - |
+      set -ex
+      cat << EOF | kubectl create -f -
+      apiVersion: networking.istio.io/v1alpha3
+      kind: Gateway
+      metadata:
+        name: $(inputs.params.Service)-gateway
+      spec:
+        selector:
+          istio: ingressgateway
+        servers:
+        - port:
+            number: 443
+            name: https-$(inputs.params.Service)
+            protocol: HTTPS
+          hosts:
+          - $(inputs.params.ExternalDomain)
+          tls:
+            credentialName: $(inputs.params.TLScredentialName)
+            mode: SIMPLE
+            privateKey: sds
+            serverCertificate: sds
+      ---
+      apiVersion: networking.istio.io/v1alpha3
+      kind: VirtualService
+      metadata:
+        name: $(inputs.params.Service)-virtual-service
+      spec:
+        hosts:
+        - $(inputs.params.ExternalDomain)
+        gateways:
+        - $(inputs.params.Service)-gateway
+        http:
+        - route:
+          - destination:
+              host: $(inputs.params.Service)
+              port:
+                number: $(inputs.params.ServicePort)
+      EOF
+EOF2
+

Create TaskRun to start create-istio-gateway-virtualservice Task:

cat << EOF | kubectl apply -f -
+apiVersion: tekton.dev/v1alpha1
+kind: TaskRun
+metadata:
+  name: create-istio-gateway-virtualservice-run
+  namespace: getting-started
+spec:
+  taskRef:
+    name: create-istio-gateway-virtualservice
+  inputs:
+    params:
+    - name: TLScredentialName
+      value: ingress-cert-${LETSENCRYPT_ENVIRONMENT}
+    - name: ExternalDomain
+      value: getting-started.${MY_DOMAIN}
+    - name: Service
+      value: el-getting-started-listener
+    - name: ServicePort
+      value: "8080"
+  timeout: 1000s
+  serviceAccount: tekton-triggers-createwebhook
+EOF
+

Create webhook Task:

cat << \EOF | kubectl apply -f -
+apiVersion: tekton.dev/v1alpha1
+kind: Task
+metadata:
+  name: create-webhook
+  namespace: getting-started
+spec:
+  volumes:
+  - name: github-secret
+    secret:
+      secretName: $(inputs.params.GitHubSecretName)
+
+  inputs:
+    params:
+    - name: ExternalDomain
+      description: "The external domain for the EventListener e.g. `$(inputs.params.EventListenerName).<PROXYIP>.nip.io`"
+    - name: GitHubUser
+      description: "The GitHub user"
+    - name: GitHubRepo
+      description: "The GitHub repo where the webhook will be created"
+    - name: GitHubOrg
+      description: "The GitHub organization where the webhook will be created"
+    - name: GitHubSecretName
+      description: "The Secret name for GitHub access token. This is always mounted and must exist"
+    - name: GitHubAccessTokenKey
+      description: "The GitHub access token key name"
+    - name: GitHubSecretStringKey
+      description: "The GitHub secret string key name"
+    - name: GitHubDomain
+      description: "The GitHub domain. Override for GitHub Enterprise"
+      default: "github.com"
+    - name: WebhookEvents
+      description: "List of events the webhook will send notifications for"
+      default: "[\\\"push\\\",\\\"pull_request\\\"]"
+
+  steps:
+  - name: create-webhook
+    image: pstauffer/curl:latest
+    volumeMounts:
+    - name: github-secret
+      mountPath: /var/secret
+    command:
+    - sh
+    args:
+    - -ce
+    - |
+      set -e
+      echo "Create Webhook"
+      if [ $(inputs.params.GitHubDomain) = "github.com" ];then
+        curl -v -d "{\"name\": \"web\",\"active\": true,\"events\": $(inputs.params.WebhookEvents),\"config\": {\"url\": \"https://$(inputs.params.ExternalDomain)\",\"content_type\": \"json\",\"insecure_ssl\": \"1\" ,\"secret\": \"$(cat /var/secret/$(inputs.params.GitHubSecretStringKey))\"}}" -X POST -u $(inputs.params.GitHubUser):$(cat /var/secret/$(inputs.params.GitHubAccessTokenKey)) -L https://api.github.com/repos/$(inputs.params.GitHubOrg)/$(inputs.params.GitHubRepo)/hooks
+      else
+        curl -d "{\"name\": \"web\",\"active\": true,\"events\": $(inputs.params.WebhookEvents),\"config\": {\"url\": \"https://$(inputs.params.ExternalDomain)/\",\"content_type\": \"json\",\"insecure_ssl\": \"1\" ,\"secret\": \"$(cat /var/secret/$(inputs.params.GitHubSecretStringKey))\"}}" -X POST -u $(inputs.params.GitHubUser):$(cat /var/secret/$(inputs.params.GitHubAccessTokenKey)) -L https://$(inputs.params.GitHubDomain)/api/v3/repos/$(inputs.params.GitHubOrg)/$(inputs.params.GitHubRepo)/hooks
+      fi
+EOF
+

Create secret with GitHub Personal Access Token (opens new window):

cat << EOF | kubectl apply -f -
+apiVersion: v1
+kind: Secret
+metadata:
+  name: webhook-secret
+  namespace: getting-started
+stringData:
+  token: ${GITHUB_TOKEN}
+  secret: random-string-data
+EOF
+

Create TaskRun to initiate Webhook:

sleep 20 # Wait for DNS created by previous TaskRun
+cat << EOF | kubectl apply -f -
+apiVersion: tekton.dev/v1alpha1
+kind: TaskRun
+metadata:
+  name: create-webhook-run
+  namespace: getting-started
+spec:
+  taskRef:
+    name: create-webhook
+  inputs:
+    params:
+    - name: GitHubOrg
+      value: "ruzickap"
+    - name: GitHubUser
+      value: "ruzickap"
+    - name: GitHubRepo
+      value: "podinfo"
+    - name: GitHubSecretName
+      value: webhook-secret
+    - name: GitHubAccessTokenKey
+      value: token
+    - name: GitHubSecretStringKey
+      value: secret
+    - name: ExternalDomain
+      value: getting-started.${MY_DOMAIN}
+  timeout: 1000s
+  serviceAccount: tekton-triggers-createwebhook
+EOF
+sleep 5
+

Verify if the TaskRuns were successfully executed:

kubectl get taskruns.tekton.dev -n getting-started
+

Output:

NAME                                      SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
+create-istio-gateway-virtualservice-run   True        Succeeded   80s         71s
+create-webhook-run                        Unknown     Pending     2s
+

Look at the logs from create-istio-gateway-virtualservice TaskRun:

tkn taskrun logs -n getting-started create-istio-gateway-virtualservice-run
+

Output:

[create-istio-gateway-virtualservice] + + kubectl create -f -
+[create-istio-gateway-virtualservice] cat
+[create-istio-gateway-virtualservice] gateway.networking.istio.io/el-getting-started-listener-gateway created
+[create-istio-gateway-virtualservice] virtualservice.networking.istio.io/el-getting-started-listener-virtual-service created
+

Look at the logs from create-webhook-run TaskRun:

tkn taskrun logs -n getting-started create-webhook-run
+

Output:

[create-webhook] Create Webhook
+[create-webhook] Note: Unnecessary use of -X or --request, POST is already inferred.
+[create-webhook]   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+[create-webhook]                                  Dload  Upload   Total   Spent    Left  Speed
+  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 140.82.118.6...
+[create-webhook] * TCP_NODELAY set
+[create-webhook] * Connected to api.github.com (140.82.118.6) port 443 (#0)
+[create-webhook] * ALPN, offering h2
+[create-webhook] * ALPN, offering http/1.1
+[create-webhook] * successfully set certificate verify locations:
+[create-webhook] *   CAfile: /etc/ssl/certs/ca-certificates.crt
+[create-webhook]   CApath: none
+[create-webhook] * TLSv1.2 (OUT), TLS handshake, Client hello (1):
+[create-webhook] } [232 bytes data]
+[create-webhook] * TLSv1.2 (IN), TLS handshake, Server hello (2):
+[create-webhook] { [108 bytes data]
+[create-webhook] * TLSv1.2 (IN), TLS handshake, Certificate (11):
+[create-webhook] { [2851 bytes data]
+[create-webhook] * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
+[create-webhook] { [300 bytes data]
+[create-webhook] * TLSv1.2 (IN), TLS handshake, Server finished (14):
+[create-webhook] { [4 bytes data]
+[create-webhook] * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
+[create-webhook] } [37 bytes data]
+[create-webhook] * TLSv1.2 (OUT), TLS change cipher, Client hello (1):
+[create-webhook] } [1 bytes data]
+[create-webhook] * TLSv1.2 (OUT), TLS handshake, Finished (20):
+[create-webhook] } [16 bytes data]
+[create-webhook] * TLSv1.2 (IN), TLS change cipher, Client hello (1):
+[create-webhook] { [1 bytes data]
+[create-webhook] * TLSv1.2 (IN), TLS handshake, Finished (20):
+[create-webhook] { [16 bytes data]
+[create-webhook] * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
+[create-webhook] * ALPN, server accepted to use http/1.1
+[create-webhook] * Server certificate:
+[create-webhook] *  subject: C=US; ST=California; L=San Francisco; O=GitHub, Inc.; CN=*.github.com
+[create-webhook] *  start date: Jul  8 00:00:00 2019 GMT
+[create-webhook] *  expire date: Jul 16 12:00:00 2020 GMT
+[create-webhook] *  subjectAltName: host "api.github.com" matched cert's "*.github.com"
+[create-webhook] *  issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=DigiCert SHA2 High Assurance Server CA
+[create-webhook] *  SSL certificate verify ok.
+[create-webhook] * Server auth using Basic with user 'ruzickap'
+[create-webhook] > POST /repos/ruzickap/podinfo/hooks HTTP/1.1
+[create-webhook] > Host: api.github.com
+[create-webhook] > Authorization: Basic cnxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxU3MA==
+[create-webhook] > User-Agent: curl/7.60.0
+[create-webhook] > Accept: */*
+[create-webhook] > Content-Length: 195
+[create-webhook] > Content-Type: application/x-www-form-urlencoded
+[create-webhook] >
+[create-webhook] } [195 bytes data]
+[create-webhook] * upload completely sent off: 195 out of 195 bytes
+[create-webhook] &lt; HTTP/1.1 201 Created
+[create-webhook] &lt; Date: Fri, 27 Dec 2019 10:19:37 GMT
+[create-webhook] &lt; Content-Type: application/json; charset=utf-8
+[create-webhook] &lt; Content-Length: 688
+[create-webhook] &lt; Server: GitHub.com
+[create-webhook] &lt; Status: 201 Created
+[create-webhook] &lt; X-RateLimit-Limit: 5000
+[create-webhook] &lt; X-RateLimit-Remaining: 4992
+[create-webhook] &lt; X-RateLimit-Reset: 1577445296
+[create-webhook] &lt; Cache-Control: private, max-age=60, s-maxage=60
+[create-webhook] &lt; Vary: Accept, Authorization, Cookie, X-GitHub-OTP
+[create-webhook] &lt; ETag: "a9xxxxxxxxxxxxxxxxxxxxxxxxxxxxe3"
+[create-webhook] &lt; X-OAuth-Scopes: admin:org_hook, admin:repo_hook, delete_repo, read:org, repo, user:email
+[create-webhook] &lt; X-Accepted-OAuth-Scopes: admin:repo_hook, public_repo, repo, write:repo_hook
+[create-webhook] &lt; Location: https://api.github.com/repos/ruzickap/podinfo/hooks/170061618
+[create-webhook] &lt; X-GitHub-Media-Type: github.v3; format=json
+[create-webhook] &lt; Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type
+[create-webhook] &lt; Access-Control-Allow-Origin: *
+[create-webhook] &lt; Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
+[create-webhook] &lt; X-Frame-Options: deny
+[create-webhook] &lt; X-Content-Type-Options: nosniff
+[create-webhook] &lt; X-XSS-Protection: 1; mode=block
+[create-webhook] &lt; Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
+[create-webhook] &lt; Content-Security-Policy: default-src 'none'
+[create-webhook] &lt; Vary: Accept-Encoding
+[create-webhook] &lt; X-GitHub-Request-Id: CEXX:XXXXX:XXXXXXX:XXXXXXX:XXXXXXB9
+[create-webhook] &lt;
+[create-webhook] { [688 bytes data]
+100   883  100   688  100   195   1746    494 --:--:-- --:--:-- --:--:--  2241
+[create-webhook] * Connection #0 to host api.github.com left intact
+[create-webhook] {
+[create-webhook]   "type": "Repository",
+[create-webhook]   "id": 170061618,
+[create-webhook]   "name": "web",
+[create-webhook]   "active": true,
+[create-webhook]   "events": [
+[create-webhook]     "pull_request",
+[create-webhook]     "push"
+[create-webhook]   ],
+[create-webhook]   "config": {
+[create-webhook]     "content_type": "json",
+[create-webhook]     "insecure_ssl": "1",
+[create-webhook]     "secret": "********",
+[create-webhook]     "url": "https://getting-started.mylabs.dev"
+[create-webhook]   },
+[create-webhook]   "updated_at": "2019-12-27T10:19:37Z",
+[create-webhook]   "created_at": "2019-12-27T10:19:37Z",
+[create-webhook]   "url": "https://api.github.com/repos/ruzickap/podinfo/hooks/170061618",
+[create-webhook]   "test_url": "https://api.github.com/repos/ruzickap/podinfo/hooks/170061618/test",
+[create-webhook]   "ping_url": "https://api.github.com/repos/ruzickap/podinfo/hooks/170061618/pings",
+[create-webhook]   "last_response": {
+[create-webhook]     "code": null,
+[create-webhook]     "status": "unused",
+[create-webhook]     "message": null
+[create-webhook]   }
+[create-webhook] }
+

You should also see in the GitHub / Settings / Webhook the registration https://github.com/ruzickap/podinfo/settings/hooks/ (opens new window):

GitHub Webhooks

After clicking on the Webhook you can see the details:

GitHub Webhooks - Details

In case you are troubleshooting the incoming traffic from GitHub the look at +the logs of the pod. You should be able to see the details +in the kubectl logs.

kubectl get pods -n getting-started -l eventlistener=getting-started-listener
+sleep 5
+

Output:

NAME                                          READY   STATUS    RESTARTS   AGE
+el-getting-started-listener-fcffc467d-xwsfp   1/1     Running   0          2m6s
+

# Change the source code of the app

Trigger the pipeline by calling the:

echo "Trigger build" >> podinfo/README.md
+git -C podinfo commit -s -a -m "Standard version"
+git -C podinfo push ruzickap
+sleep 30
+kubectl --timeout=10m -n getting-started wait --for=condition=Succeeded pipelineruns --all
+sleep 5
+

Output:

[master d4120e6] Standard version
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+Warning: Permanently added '[ssh.github.com]:443,[192.30.253.122]:443' (RSA) to the list of known hosts.
+Enumerating objects: 5, done.
+Counting objects: 100% (5/5), done.
+Delta compression using up to 4 threads
+Compressing objects: 100% (3/3), done.
+Writing objects: 100% (3/3), 325 bytes | 162.00 KiB/s, done.
+Total 3 (delta 2), reused 0 (delta 0)
+remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
+To github.com:ruzickap/podinfo.git
+   948de81..d4120e6  master -> master
+pipelinerun.tekton.dev/getting-started-pipeline-run-fzrtg condition met
+

Look at the logs of the newly deployed pod (look at "Starting podinfo"):

PODINFO_POD=$(kubectl get pods -n getting-started -l=run=podinfo -o jsonpath="{.items[0].metadata.name}")
+kubectl -n getting-started logs -n getting-started ${PODINFO_POD}
+

Output:

{"level":"info","ts":"2019-11-27T15:00:58.907Z","caller":"podinfo/main.go:120","msg":"Starting podinfo","version":"3.1.5","revision":"164a27b33b09d1b50fad277a60a6c19d353cb9d8","port":"9898"}
+

Let's try to change the code of the application:

sed -i "s/Starting podinfo/Starting podinfo - new Tekton build version/" podinfo/cmd/podinfo/main.go
+git -C podinfo diff
+git -C podinfo commit -s -a -m "String changed"
+git -C podinfo push ruzickap
+sleep 20
+

Output:

─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
+modified: cmd/podinfo/main.go
+─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
+@ cmd/podinfo/main.go:120 @ func main() {
+    }
+
+    // log version and port
+    logger.Info("Starting podinfo",
+    logger.Info("Starting podinfo - new Tekton build version",
+        zap.String("version", viper.GetString("version")),
+        zap.String("revision", viper.GetString("revision")),
+        zap.String("port", srvCfg.Port),
+[master 4d9f5bc] String changed
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+Warning: Permanently added '[ssh.github.com]:443,[192.30.253.122]:443' (RSA) to the list of known hosts.
+Enumerating objects: 9, done.
+Counting objects: 100% (9/9), done.
+Delta compression using up to 4 threads
+Compressing objects: 100% (4/4), done.
+Writing objects: 100% (5/5), 459 bytes | 459.00 KiB/s, done.
+Total 5 (delta 2), reused 0 (delta 0)
+remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
+To github.com:ruzickap/podinfo.git
+   d4120e6..4d9f5bc  master -> master
+

Wait for the pipelines to complete:

kubectl --timeout=10m -n getting-started wait --for=condition=Succeeded pipelineruns --all
+sleep 5
+

Output:

pipelinerun.tekton.dev/getting-started-pipeline-run-dzqdl condition met
+pipelinerun.tekton.dev/getting-started-pipeline-run-fzrtg condition met
+

Check how the logs of the newly deployed podinfo logs should contain +"Starting podinfo - new Tekton build version":

PODINFO_POD=$(kubectl get pods -n getting-started -l=run=podinfo -o jsonpath="{.items[0].metadata.name}")
+kubectl -n getting-started delete pod -n getting-started ${PODINFO_POD}
+sleep 5
+PODINFO_POD=$(kubectl get pods -n getting-started -l=run=podinfo -o jsonpath="{.items[0].metadata.name}")
+kubectl -n getting-started logs -n getting-started ${PODINFO_POD}
+cd ..
+

Output:

pod "podinfo-6ccfb5f9b6-bwrbn" deleted
+{"level":"info","ts":"2019-12-27T10:28:22.304Z","caller":"podinfo/main.go:120","msg":"Starting podinfo - new Tekton build version","version":"3.1.5","revision":"4d9f5bc71bd9a8c7ae44a9cd9631e45067727a2e","port":"9898"}
+
+ + + diff --git a/part-09/index.html b/part-09/index.html new file mode 100644 index 0000000..6e758ff --- /dev/null +++ b/part-09/index.html @@ -0,0 +1,96 @@ + + + + + + Knative operations | Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

# Knative operations

Create service my-podinfo-2 with image:

kn service create my-podinfo-2 --port 9898 --image harbor.mylabs.dev/library/my-podinfo:3.1.0
+sleep 30
+

Output:

Creating service 'my-podinfo-2' in namespace 'default':
+
+  0.205s The Route is still working to reflect the latest desired specification.
+  0.230s Configuration "my-podinfo-2" is waiting for a Revision to become ready.
+  7.132s ...
+  7.417s Ingress has not yet been reconciled.
+  9.415s Ready to serve.
+
+Service 'my-podinfo-2' created with latest revision 'my-podinfo-2-fzhhd-1' and URL:
+http://my-podinfo-2.default.mylabs.dev
+

Check if the application is really working:

curl -k http://my-podinfo-2.default.mylabs.dev https://my-podinfo-2.default.mylabs.dev
+

Output:

{
+  "hostname": "my-podinfo-2-fzhhd-1-deployment-566757c497-xvc2m",
+  "version": "3.1.0",
+  "revision": "5fb970b526dd40f9a94085fd237f0a2c3bd65520",
+  "color": "blue",
+  "message": "greetings from podinfo v3.1.0",
+  "goos": "linux",
+  "goarch": "amd64",
+  "runtime": "go1.12.14",
+  "num_goroutine": "6",
+  "num_cpu": "2"
+}{
+  "hostname": "my-podinfo-2-fzhhd-1-deployment-566757c497-xvc2m",
+  "version": "3.1.0",
+  "revision": "5fb970b526dd40f9a94085fd237f0a2c3bd65520",
+  "color": "blue",
+  "message": "greetings from podinfo v3.1.0",
+  "goos": "linux",
+  "goarch": "amd64",
+  "runtime": "go1.12.14",
+  "num_goroutine": "6",
+  "num_cpu": "2"
+}
+

Set hard limit of concurrent requests to be processed by a single replica:

kn service update my-podinfo-2 --concurrency-limit=1
+

Output:

Updating Service 'my-podinfo-2' in namespace 'default':
+
+  3.050s Traffic is not yet migrated to the latest revision.
+  3.104s Ingress has not yet been reconciled.
+  4.689s Ready to serve.
+
+Service 'my-podinfo-2' updated with latest revision 'my-podinfo-2-hfqhc-2' and URL:
+http://my-podinfo-2.default.mylabs.dev
+

Check the pods:

kubectl get pods
+

Output:

NAME                                                                         READY   STATUS      RESTARTS   AGE
+my-podinfo-2-fzhhd-1-deployment-566757c497-xvc2m                             2/2     Running     0          48s
+my-podinfo-2-hfqhc-2-deployment-864c8985c-jz59h                              2/2     Running     0          5s
+my-podinfo-build-docker-image-from-git-pipelinerun-build--msbcv-pod-d6861e   0/6     Completed   0          22m
+

podinfo - http/https

+ + + diff --git a/part-10/index.html b/part-10/index.html new file mode 100644 index 0000000..e02532a --- /dev/null +++ b/part-10/index.html @@ -0,0 +1,78 @@ + + + + + + Clean-up | Kubernetes + Knative + GitLab + Harbor + + + + + + + + +

# Clean-up

Clean-up

Configure kubeconfig:

export MY_DOMAIN="mylabs.dev"
+kops export kubecfg ${USER}-k8s.${MY_DOMAIN} --state=s3://${USER}-kops-k8s --kubeconfig /tmp/kubeconfig.conf
+export KUBECONFIG=/tmp/kubeconfig.conf
+

Remove DNS records:

kubectl delete gateways.networking.istio.io --all --all-namespaces && \
+kubectl delete pod -n external-dns --all && \
+sleep 15
+

Output:

gateway.networking.istio.io "el-getting-started-listener-gateway" deleted
+gateway.networking.istio.io "gitlab-gateway" deleted
+gateway.networking.istio.io "harbor-gateway" deleted
+gateway.networking.istio.io "istio-autogenerated-k8s-ingress" deleted
+gateway.networking.istio.io "istio-services-gateway" deleted
+gateway.networking.istio.io "knative-services-gateway" deleted
+gateway.networking.istio.io "cluster-local-gateway" deleted
+gateway.networking.istio.io "knative-ingress-gateway" deleted
+pod "external-dns-685b847795-mrchv" deleted
+

Delete GitHub repositories:

hub delete -y ruzickap/podinfo
+

Cleanup + Remove Helm:

test -d /home/${USER}/.helm        && rm -rf /home/${USER}/.helm
+test -d /home/${USER}/.config/helm && rm -rf /home/${USER}/.config/helm
+

Cleanup + Remove tmp directory:

rm -rf tmp
+

Docker certificate cleanup if exists:

sudo rm -rf /etc/docker/certs.d/harbor.${MY_DOMAIN}
+

Remove K8s cluster:

kops delete cluster --name=${USER}-k8s.${MY_DOMAIN} --yes --state=s3://${USER}-kops-k8s
+

Output:

...
+Deleted kubectl config for pruzicka-k8s.mylabs.de
+

Remove S3 bucket used for storing the configuration by kops:

aws s3 rm s3://${USER}-kops-k8s/${USER}-app-build.tar
+aws s3api delete-bucket --bucket ${USER}-kops-k8s --region eu-central-1
+

Clean Policy, User, Access Key in AWS:

# aws route53 delete-hosted-zone --id $(aws route53 list-hosted-zones --query "HostedZones[?Name==\`${MY_DOMAIN}.\`].Id" --output text)
+
+POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName==\`${USER}-k8s-${MY_DOMAIN}\`].{ARN:Arn}" --output text) && \
+aws iam detach-user-policy --user-name "${USER}-k8s-${MY_DOMAIN}" --policy-arn ${POLICY_ARN} && \
+aws iam delete-policy --policy-arn ${POLICY_ARN}
+
+USER_ACCESS_KEYS=$(aws iam list-access-keys --user-name ${USER}-k8s-${MY_DOMAIN} --query "AccessKeyMetadata[].AccessKeyId" --output text) && \
+aws iam delete-access-key --user-name ${USER}-k8s-${MY_DOMAIN} --access-key-id ${USER_ACCESS_KEYS}
+
+aws iam delete-user --user-name ${USER}-k8s-${MY_DOMAIN}
+

Remove other files:

rm demo-magic.sh kubeconfig.conf README.sh &> /dev/null
+
+ + +