diff --git a/learn/learn-kubernetes-master/.gitignore b/learn/learn-kubernetes-master/.gitignore new file mode 100644 index 0000000..15bdab2 --- /dev/null +++ b/learn/learn-kubernetes-master/.gitignore @@ -0,0 +1,5 @@ +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr diff --git a/learn/learn-kubernetes-master/LICENSE b/learn/learn-kubernetes-master/LICENSE new file mode 100644 index 0000000..e7e03ed --- /dev/null +++ b/learn/learn-kubernetes-master/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 YDD + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/learn/learn-kubernetes-master/README.md b/learn/learn-kubernetes-master/README.md new file mode 100644 index 0000000..45de7ef --- /dev/null +++ b/learn/learn-kubernetes-master/README.md @@ -0,0 +1,239 @@ +# 一个月学会 Kubernetes + +![header](./header.png) + +哈喽,欢迎来到我的课程。我希望本课程可以给大家带来良好的学习体验。 + +在每一章中都有一个明确的重点,一个有用的话题,并且这些话题是相互关联的,让你有一个全面的了解,了解如何在实践中使用 Kubernetes。你需要大量的练习,每天练习巩固每一章获得的知识,形成肌肉记忆。 + +可以移步到 [GitHub Pages](https://yyong-brs.github.io/learn-kubernetes/) 页面进行阅读。 + +更多云原生技术,请关注公众号:云原生拓展 + +![公众号](./gongzh.png) + +# 目录 + +- **第一部分** 快速了解 Kubernetes + + - 第一章 [开始之前](./chapter1.md) + + - 1.1 [了解 Kubernetes](./chapter1.md#11-了解-kubernetes) + + - 1.2 [这本书适合你吗?](./chapter1.md#12-这本书适合你吗) + + - 1.3 [创建你的实验环境](./chapter1.md#13-创建你的实验环境) + + - 1.4 [立即见效](./chapter1.md#14-立即见效) + + - 第二章 [Pods & Deployment 在 Kubernetes 中的应用](./chapter2.md) + + - 2.1 [Kubernetes 如何运行并管理容器](./chapter2.md#21-kubernetes-如何运行并管理容器) + + - 2.2 [通过控制器运行 Pods](./chapter2.md#22-通过控制器运行-pods) + + - 2.3 [在清单文件中定义 Deployments](./chapter2.md#23-在清单文件中定义-deployments) + + - 2.4 [应用在 Pods 中运行](./chapter2.md#24-应用在-pods-中运行) + + - 2.5 [了解 Kubernetes 资源管理](./chapter2.md#25-了解-kubernetes-资源管理) + + - 2.6 [实验室](./chapter2.md#26-实验室) + + - 第三章 [通过 Service 网络连接 Pods](./chapter3.md) + + - 3.1 [Kubernetes 如何路由网络流量](./chapter3.md#31-kubernetes-如何路由网络流量) + + - 3.2 [在 Pods 间路由流量](./chapter3.md#32-在-pods-间路由流量) + + - 3.3 [路由外部流量到 Pods](./chapter3.md#33-路由外部流量到-pods) + + - 3.4 [将流量路由到 Kubernetes 外面](./chapter3.md#34-将流量路由到-kubernetes-外面) + + - 3.5 [理解 Kubernetes Service 解析](./chapter3.md#35-理解-kubernetes-service-解析) + + - 3.6 [实验室](./chapter3.md#36-实验室) + + - 第四章 [通过 ConfigMaps 和 Secrets 配置应用程序](./chapter4.md) + + - 4.1 [Kubernetes 如何为应用提供配置](./chapter4.md#41-kubernetes-如何为应用提供配置) + + - 4.2 [在 ConfigMaps 中存储和使用配置文件](./chapter4.md#42-在-configmaps-中存储和使用配置文件) + + - 4.3 [从 ConfigMaps 中查找配置数据](./chapter4.md#43-从-configmaps-中查找配置数据) + + - 4.4 [使用 Secrets 配置敏感数据](./chapter4.md#44-使用-secrets-配置敏感数据) + + - 4.5 [管理 Kubernetes 中的应用程序配置](./chapter4.md#45-管理-kubernetes-中的应用程序配置) + + - 4.6 [实验室](./chapter4.md#46-实验室) + + - 第五章 [通过 volumes,mounts,claims 存储数据](./chapter5.md) + + - 5.1 [Kubernetes 如何构建容器文件系统](./chapter5.md#51-kubernetes-如何构建容器文件系统) + + - 5.2 [在节点使用 volumes 及 mounts 存储数据](./chapter5.md#52-在节点使用-volumes-及-mounts-存储数据) + + - 5.3 [使用 persistent volumes 及 claims 存储集群范围数据](./chapter5.md#53-使用-persistent-volumes-及-claims-存储集群范围数据) + + - 5.4 [动态 volume provisioning 及 storage classes](./chapter5.md#54-动态-volume-provisioning-及-storage-classes) + + - 5.5 [理解 Kubernetes 中存储的选择](./chapter5.md#55-理解-kubernetes-中存储的选择) + + - 5.6 [实验室](./chapter5.md#56-实验室) + + - 第六章 [通过 controllers 在多个 Pod 之间扩展应用](./chapter6.md) + + - 6.1 [Kubernetes 如何大规模运行应用程序](./chapter6.md#61-kubernetes-如何大规模运行应用程序) + + - 6.2 [使用 Deployments 和 ReplicaSets 来扩展负载](./chapter6.md#62-使用-deployments-和-replicasets-来扩展负载) + + - 6.3 [使用 DaemonSets 实现高可用性](./chapter6.md#63-使用-daemonsets-实现高可用性) + + - 6.4 [理解 Kubernetes 中的对象所有权](./chapter6.md#64-理解-kubernetes-中的对象所有权) + + - 6.5 [实验室](./chapter6.md#65-实验室) + +- **第二部分** 现实世界中的 Kubernetes + + - 第七章 [使用多容器 Pods 扩展应用程序](./chapter7.md) + + - 7.1 [Pod 中多个容器如何通信](./chapter7.md#71-pod-中多个容器如何通信) + + - 7.2 [使用 init 容器设置应用程序](./chapter7.md#72-使用-init-容器设置应用程序) + + - 7.3 [通过 adapter 容器以应用一致性](./chapter7.md#73-通过-adapter-容器以应用一致性) + + - 7.4 [通过 ambassador 容器抽象连接](./chapter7.md#74-通过-ambassador-容器抽象连接) + + - 7.5 [理解 Pod 环境](./chapter7.md#75-理解-pod-环境) + + - 7.6 [实验室](./chapter7.md#76-实验室) + + - 第八章 [使用 StatfulSets 和 Jobs 运行数据量大的应用](./chapter8.md) + + - 8.1 [Kubernetes 如何用 StatefulSets 建模稳定性](./chapter8.md#81-kubernetes-如何用-statefulsets-建模稳定性) + + - 8.2 [在 StatefulSets 中使用 init 容器引导 Pod](./chapter8.md#82-在-statefulsets-中使用-init-容器引导-pod) + + - 8.3 [使用卷声明模板请求存储](./chapter8.md#83-使用卷声明模板请求存储) + + - 8.4 [使用 Jobs 和 CronJobs 运行维护任务](./chapter8.md#84-使用-jobs-和-cronjobs-运行维护任务) + + - 8.5 [为有状态应用程序选择平台](./chapter8.md#85-为有状态应用程序选择平台) + + - 8.6 [实验室](./chapter8.md#86-实验室) + + - 第九章 [通过 rollouts 和 rollbacks 管理应用发布](./chapter9.md) + + - 9.1 [Kubernetes 如何管理 rollouts](./chapter9.md#91-kubernetes-如何管理-rollouts) + + - 9.2 [使用 rollouts 和 rollbacks 更新 Deployments](./chapter9.md#92-使用-rollouts-和-rollbacks-更新-deployments) + + - 9.3 [为 Deployments 配置滚动更新](./chapter9.md#93-为-deployments-配置滚动更新) + + - 9.4 [DaemonSets 和 StatefulSets 中的滚动更新](./chapter9.md#94-daemonSets-和-statefulsets-中的滚动更新) + + - 9.5 [理解发布策略](./chapter9.md#95-理解发布策略) + + - 9.6 [实验室](./chapter9.md#96-实验室) + + - 第十章 [通过 Helm 打包并管理应用](./chapter11.md) + + - 10.1 [Helm 给 Kubernetes 带来了什么](./chapter11.md#101-helm-给-Kubernetes-带来了什么) + + - 10.2 [使用 Helm 打包你自己的应用](./chapter11.md#102-使用-helm-打包你自己的应用) + + - 10.3 [charts 中的模块依赖](./chapter11.md#103-charts-中的模块依赖) + + - 10.4 [升级及回滚 Helm releases](./chapter11.md#104-升级及回滚-helm-releases) + + - 10.5 [理解 Helm 定位](./chapter11.md#105-理解-helm-定位) + + - 10.6 [实验室](./chapter11.md#106-实验室) + + - 第十一章 [App 开发——开发人员工作流程及 CI/CD](./chapter11.md) + + - 11.1 [Docker 开发人员工作流程](./chapter11.md#111-docker-开发人员工作流程) + + - 11.2 [Kubernetes 开发人员工作流程](./chapter11.md#112-kubernetes-开发人员工作流程) + + - 11.3 [使用上下文和名称空间隔离工作负载](./chapter11.md#113-使用上下文和名称空间隔离工作负载) + + - 11.4 [在不考虑 Docker 的 Kubernetes 中持续交付](./chapter11.md#114-在不考虑-docker-的-kubernetes-中持续交付) + + - 11.5 [评估 Kubernetes 上的开发人员工作流程](./chapter11.md#115-评估-kubernetes-上的开发人员工作流程) + + - 11.6 [实验室](./chapter11.md#116-实验室) + +- **第三部分** 为生产而准备 + + - 第十二章 [增强自我修复应用程序](./chapter12.md) + + - 12.1 [使用 readiness 探测将流量路由到健康 Pods](./chapter12.md#121-使用-readiness-探测将流量路由到健康-pods) + + - 12.2 [通过 liveness 探测重启不健康的 Pods](./chapter12.md#122-通过-liveness-探测重启不健康的-pods) + + - 12.3 [使用 Helm 安全地部署升级](./chapter12.md#123-使用-helm-安全地部署升级) + + - 12.4 [通过 resource limits 保护应用和节点](./chapter12.md#124-通过-resource-limits-保护应用和节点) + + - 12.5 [了解自我修复应用的局限性](./chapter12.md#125-了解自我修复应用的局限性) + + - 12.6 [实验室](./chapter12.md#126-实验室) + + - 第十三章 [使用 Fluentd 和 Elasticsearch 集中化日志](./chapter13.md) + + - 13.1 [Kubernetes 如何存储日志条目](./chapter13.md#131-kubernetes-如何存储日志条目) + + - 13.2 [使用 Fluentd 收集节点日志](./chapter13.md#132-使用-fluentd-收集节点日志) + + - 13.3 [向 Elasticsearch 发送日志](./chapter13.md#133-向-elasticsearch-发送日志) + + - 13.4 [解析和过滤日志条目](./chapter13.md#134-解析和过滤日志条目) + + - 13.5 [了解 Kubernetes 中的日志记录选项](./chapter13.md#135-了解-kubernetes-中的日志记录选项) + + - 13.6 [实验室](./chapter13.md#136-实验室) + + - 第十四章 [使用 Prometheus 监控应用程序和 Kubernetes](./chapter14.md) + + - 14.1 [Prometheus 如何监控 Kubernetes 的工作负载](./chapter14.md#141-prometheus-如何监控-kubernetes-的工作负载) + + - 14.2 [监视使用 Prometheus 客户端库构建的应用程序](./chapter14.md#142-监视使用-prometheus-客户端库构建的应用程序) + + - 14.3 [通过 metrics exporters 来监控第三方应用](./chapter14.md#143-通过-metrics-exporters-来监控第三方应用) + + - 14.4 [监控容器以及 kubernetes 对象](./chapter14.md#144-监控容器以及-kubernetes-对象) + + - 14.5 [了解您在监控方面所做的投资](./chapter14.md#145-了解您在监控方面所做的投资) + + - 14.6 [实验室](./chapter14.md#146-实验室) + + - 第十五章 [使用 Ingress 管理流入流量](./chapter15.md) + + - 15.1 [Kubernetes 如何使用 Ingress 路由流量](./chapter15.md#151-kubernetes-如何使用-ingress-路由流量) + + - 15.2 [使用 Ingress rules 路由 Http 流量](./chapter15.md#152-使用-ingress-rules-路由-http-流量) + + - 15.3 [比较 Ingress 控制器](./chapter15.md#153-比较-ingress-控制器) + + - 15.4 [使用 Ingress 通过 HTTPS 保护您的应用程序](./chapter15.md#154-使用-ingress-通过-https-保护您的应用程序) + + - 15.5 [理解 Ingress 及 Ingress 控制器](./chapter15.md#155-理解-ingress-及-ingress-控制器) + + - 15.6 [实验室](./chapter15.md#156-实验室) + + - 第十六章 [使用策略上下文和准入控制保护应用程序](./chapter16.md) + + - 16.1 [使用网络策略(network policies)保护通信](./chapter16.md#161-使用网络策略(network-policies)保护通信) + + - 16.2 [使用安全上下文(security contets)限制容器功能](./chapter16.md#162-使用安全上下文(security-contets)限制容器功能) + + - 16.3 [使用 webhook 阻止和修改工作负载](./chapter16.md#163-使用-webhook-阻止和修改工作负载) + + - 16.4 [使用 Open Policy Agent 控制准入](./chapter16.md#164-使用-open-policy-agent-控制准入) + + - 16.5 [深入了解 Kubernetes 中的安全性](./chapter16.md#165-深入了解-kubernetes-中的安全性) + + - 16.6 [实验室](./chapter16.md#166-实验室) \ No newline at end of file diff --git a/learn/learn-kubernetes-master/_config.yml b/learn/learn-kubernetes-master/_config.yml new file mode 100644 index 0000000..09c0f7e --- /dev/null +++ b/learn/learn-kubernetes-master/_config.yml @@ -0,0 +1,5 @@ +# Build settings + +remote_theme: pages-themes/modernist@v0.2.0 +plugins: +- jekyll-remote-theme diff --git a/learn/learn-kubernetes-master/chapter1.md b/learn/learn-kubernetes-master/chapter1.md new file mode 100644 index 0000000..f4a9d07 --- /dev/null +++ b/learn/learn-kubernetes-master/chapter1.md @@ -0,0 +1,206 @@ +# 第一章 开始之前 + +Kubernetes 很强大。2014 年,在 GitHub 上它被作为开源项目发布,现如今在全球社区平均每周有 200 次变更提交,拥有2500名贡献者。一年一度的 KubeCon 会议的与会者从 2016年的 1000 多人增加到现在的 12000 多人,现在已经成为美国、欧洲和亚洲举办的全球系列活动。所有主流的云服务商提供托管的 Kubernetes 服务,您可以在数据中心或者在你的笔记本电脑上运行 Kubernete,最终它们都是等同的。 + +独立性和标准化是 Kubernetes 如此流行的主要原因。一旦您的应用程序在 Kubernetes 中良好运行,就可以部署它们到任何地方,这对迁移到云的组织都很有吸引力,因为 +使它们能够在数据中心和其他云之间移动而无需重写代码。一旦你掌握了Kubernetes,你就可以在项目和组织之间快速移动,提高生产力。 + +但要达到这一点很难,因为 Kubernetes 很难。即使很简单应用程序也需要通过它部署为多个组件,以轻松的就可以跨越数百行的自定义文件格式代码进行描述。Kubernetes 将诸如负载平衡、网络、存储和计算等基础设施级别的问题带入应用程序配置,这可能是新概念,具体取决于您的IT背景。此外,Kubernetes 总是在扩展,它每季度发布新版本,通常会带来大量新功能。 + +但这是值得的。我花了很多年帮助人们学习 Kubernetes,然后一种共同的模式出现了:问题“为什么这么复杂?” 变成 “你能做到吗?这太神奇了!” Kubernetes确实是一项令人惊叹的技术。你对它了解得越多,你就会越喜欢它,这本书会加速你 +的 Kubernetes 精通之旅。 + +## 1.1 了解 Kubernetes + +本书提供了 Kubernetes 的实际使用介绍。每个章节都提供了“现在就试试”的练习,您可以通过练习和实验室获得大量使用 Kubernetes 的经验。我们将在下一章开始实际工作,但我们需要一点 +理论先行。让我们先了解一下 Kubernetes到底是什么以及它解决了什么问题。 + +Kubernetes 是一个运行容器的平台,它负责启动容器化应用程序、滚动更新、Service 层面维护、扩展以满足需求、安全访问等。在 Kubernetes 中有两个核心概念,一个是 API,用于定义你的应用,另外一个是集群,运行你的应用。集群是一组单独的服务器,它们都配置了容器运行时,如Docker,然后使用Kubernetes 连接到单个逻辑单元中。图 1.1 显示了集群的高层级视图: + +![图1.1](./images/Figure1.1.png) +
Here it is: @Model.RandomNumber
+(Using API at: @Model.ApiUrl)
+} +else if (@Model.CallFailed) +{ +RNG service unavailable!
+(Using API at: @Model.ApiUrl)
+} +else +{ + +} diff --git a/learn/learn-kubernetes-master/kiamol/ch03/docker-images/numbers/src/Numbers.Web/Pages/Index.cshtml.cs b/learn/learn-kubernetes-master/kiamol/ch03/docker-images/numbers/src/Numbers.Web/Pages/Index.cshtml.cs new file mode 100644 index 0000000..6b02399 --- /dev/null +++ b/learn/learn-kubernetes-master/kiamol/ch03/docker-images/numbers/src/Numbers.Web/Pages/Index.cshtml.cs @@ -0,0 +1,50 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Logging; +using Numbers.Web.Services; +using System; + +namespace Numbers.Web.Pages +{ + public class IndexModel : PageModel + { + private readonly ILogger`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `
`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `
`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `