26 lines
33 KiB
HTML
26 lines
33 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>如何降低 Kubernetes 学习门槛 | Kuboard</title>
|
||
<meta name="description" content="A cool Kubernetes Dashboard">
|
||
<meta name="keywords" content="Kubernetes, Docker, Dashboard, Kuboard, Linux, K8S, cluster, 分布式, 集群, 容器, 高可用">
|
||
<meta property="article:modified_time" content="Fri Jul 26 2019 15:48:26 GMT+0800 (GMT+08:00)"><meta property="og:site_name" content="Kuboard"><meta property="og:title" content="如何降低 Kubernetes 学习门槛"><meta property="og:type" content="website"><meta property="og:url" content="/overview/concepts.html"><meta name="twitter:title" content="如何降低 Kubernetes 学习门槛"><meta name="twitter:url" content="/overview/concepts.html"><meta name="twitter:card" content="summary_large_image">
|
||
<link rel="preload" href="/assets/css/0.styles.c0301a2f.css" as="style"><link rel="preload" href="/assets/js/app.469e521d.js" as="script"><link rel="preload" href="/assets/js/11.85cc1d1b.js" as="script"><link rel="preload" href="/assets/js/2.4586c502.js" as="script"><link rel="preload" href="/assets/js/8.05349e1e.js" as="script"><link rel="prefetch" href="/assets/js/10.f84e0625.js"><link rel="prefetch" href="/assets/js/12.d79ea216.js"><link rel="prefetch" href="/assets/js/13.d57917df.js"><link rel="prefetch" href="/assets/js/14.5bb6b838.js"><link rel="prefetch" href="/assets/js/15.c6f5df06.js"><link rel="prefetch" href="/assets/js/16.72005098.js"><link rel="prefetch" href="/assets/js/17.452295d5.js"><link rel="prefetch" href="/assets/js/18.c87c981a.js"><link rel="prefetch" href="/assets/js/19.dfd1a854.js"><link rel="prefetch" href="/assets/js/20.7658673b.js"><link rel="prefetch" href="/assets/js/21.d108e58c.js"><link rel="prefetch" href="/assets/js/22.17b851e0.js"><link rel="prefetch" href="/assets/js/23.55c72026.js"><link rel="prefetch" href="/assets/js/24.66a868af.js"><link rel="prefetch" href="/assets/js/25.890672df.js"><link rel="prefetch" href="/assets/js/26.959330a4.js"><link rel="prefetch" href="/assets/js/27.99a6e3a4.js"><link rel="prefetch" href="/assets/js/28.e716a025.js"><link rel="prefetch" href="/assets/js/29.4ff59e34.js"><link rel="prefetch" href="/assets/js/3.01058ecd.js"><link rel="prefetch" href="/assets/js/30.e89c0eee.js"><link rel="prefetch" href="/assets/js/31.fc5a4b53.js"><link rel="prefetch" href="/assets/js/32.4cf659a7.js"><link rel="prefetch" href="/assets/js/33.d10f420c.js"><link rel="prefetch" href="/assets/js/34.da1581ad.js"><link rel="prefetch" href="/assets/js/35.6d4bbc2f.js"><link rel="prefetch" href="/assets/js/36.40fcd0aa.js"><link rel="prefetch" href="/assets/js/37.a2236040.js"><link rel="prefetch" href="/assets/js/38.7fd741bc.js"><link rel="prefetch" href="/assets/js/4.5c8766b1.js"><link rel="prefetch" href="/assets/js/5.8a6d0bb9.js"><link rel="prefetch" href="/assets/js/6.8f8c4682.js"><link rel="prefetch" href="/assets/js/7.7adbafe6.js"><link rel="prefetch" href="/assets/js/9.b9de5eb9.js">
|
||
<link rel="stylesheet" href="/assets/css/0.styles.c0301a2f.css">
|
||
</head>
|
||
<body>
|
||
<div id="app" data-server-rendered="true"><div class="theme-container" data-v-79c95b4d><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path 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"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">Kuboard</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/overview/" class="nav-link router-link-active">简介</a></div><div class="nav-item"><a href="/install/" class="nav-link">安装</a></div><div class="nav-item"><a href="/guide/" class="nav-link">使用</a></div><div class="nav-item"><a href="/support/" class="nav-link">支持</a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><div data-v-79c95b4d><div style="text-align:center;margin-top:20px;" data-v-79c95b4d><div class="side-nav-item" style="border-bottom:2px solid #0b85ff;margin-left:0;" data-v-79c95b4d><a href="/overview/" class="nav-link" data-v-79c95b4d>简介</a></div> <div class="side-nav-item" data-v-79c95b4d><a href="/install/" class="nav-link router-link-exact-active router-link-active" data-v-79c95b4d>安装</a></div> <div class="side-nav-item" data-v-79c95b4d><a href="/guide/" class="nav-link" data-v-79c95b4d>使用</a></div> <div class="side-nav-item" data-v-79c95b4d><a href="/support/" class="nav-link" data-v-79c95b4d>支持</a></div></div></div> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>简介</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/overview/" class="sidebar-link">Kuboard</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Why Kuboard</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/overview/why-kuboard.html" class="sidebar-link">为什么选择 Kuboard</a></li><li><a href="/overview/concepts.html" class="active sidebar-link">如何降低 Kubernetes 学习门槛</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/overview/concepts.html#kubernetes-学习门槛在哪儿" class="sidebar-link">Kubernetes 学习门槛在哪儿</a></li><li class="sidebar-sub-header"><a href="/overview/concepts.html#降低-kubernetes-学习门槛" class="sidebar-link">降低 Kubernetes 学习门槛</a></li><li class="sidebar-sub-header"><a href="/overview/concepts.html#工作负载编辑器设计" class="sidebar-link">工作负载编辑器设计</a></li><li class="sidebar-sub-header"><a href="/overview/concepts.html#工作负载编辑器介绍" class="sidebar-link">工作负载编辑器介绍</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/overview/concepts.html#_1-基本信息" class="sidebar-link">1. 基本信息</a></li><li class="sidebar-sub-header"><a href="/overview/concepts.html#_2-数据卷" class="sidebar-link">2. 数据卷</a></li><li class="sidebar-sub-header"><a href="/overview/concepts.html#_3-身份信息" class="sidebar-link">3. 身份信息</a></li><li class="sidebar-sub-header"><a href="/overview/concepts.html#_4-容器" class="sidebar-link">4. 容器</a></li><li class="sidebar-sub-header"><a href="/overview/concepts.html#_5-访问方式" class="sidebar-link">5. 访问方式</a></li><li class="sidebar-sub-header"><a href="/overview/concepts.html#_6-互联网入口" class="sidebar-link">6. 互联网入口</a></li></ul></li></ul></li></ul></section></li></ul> <div style="text-align: center; margin-top: 5vh;"><strong>在线体验</strong> <div><a target="_blank" href="http://demo.eip.work/#/login?isReadOnly=true&token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXZpZXdlci10b2tlbi02djZiZiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJvYXJkLXZpZXdlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjhiYTU3YmI1LWFiMTctNDM1NS1hNTM0LTQ0Njk4NGY0NzFlZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJvYXJkLXZpZXdlciJ9.DcXNIp0RKha1zkV4ga_QlGfcvMLGx2LOyzX-0VeboC3FojKFhxnfBeoda-zTeh6ugJlSM4kQYrRcof1Kx8Mg3-UgofNmgRySbDEVKtJZyMUoHqLmySKUIn8sbX8q83RNcqwcvY-fM8-w8HSuzU7Td7WWNuZrlCL4q_LQDYIBet1nlQ83YsENKNE8rsZQFDw8YM0MH6BEZLdwyhaboy_jjYbsU7kv8gks3aIX4lh1Fs9ZFQpC_6B0_MZvb7rEeG2M8QWXoUkDoL5JCKu6Wot5GlWf0kDMxIsViggP0NmSDTKh6kIvCkT2FZ2I4guEcjE_EjBpdOS6Abta22tzLlPKhg"><p><img src="/assets/img/image-20190723104717575.f44900d3.png" style="width: 226px; height: 127px;"></p></a></div> <strong>在线提问</strong> <p><img src="/assets/img/kuboard_qq.45e78dbf.png"></p></div></aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="如何降低-kubernetes-学习门槛"><a href="#如何降低-kubernetes-学习门槛" aria-hidden="true" class="header-anchor">#</a> 如何降低 Kubernetes 学习门槛</h1> <h2 id="kubernetes-学习门槛在哪儿"><a href="#kubernetes-学习门槛在哪儿" aria-hidden="true" class="header-anchor">#</a> Kubernetes 学习门槛在哪儿</h2> <p>学习 Kubernetes 之前,必须具备的知识储备:</p> <ul><li>Linux 基础</li> <li>网络基础</li> <li>容器技术,例如 https://www.docker.com/</li></ul> <p>学习 Kubernetes 的过程中可能碰到的难关:</p> <ul><li>理解 Kubenetes 为了实现容器编排而提出的各种抽象概念以及他们之间的关系:容器组(Pod)、存储卷(Volume)、存储卷声明(PVC)、Ingress、Service 等</li> <li>安装及配置 Kubernetes 环境</li> <li>编写和维护 Kubernetes Yaml 文件</li> <li>熟悉 kubectl 命令行工具中常用的 10 多个命令</li></ul> <h2 id="降低-kubernetes-学习门槛"><a href="#降低-kubernetes-学习门槛" aria-hidden="true" class="header-anchor">#</a> 降低 Kubernetes 学习门槛</h2> <p>单纯地按章节学习 Linux 基础知识、网络知识、容器技术等,每一块儿的基础入门书籍就有几百页之多。作者认为,最好的学习方法是在实践中学习,碰到问题时去寻求答案,解决问题后去反思总结。这种学习方法趣味性强,得来的知识也最为牢靠,如果选对了方向,所学知识通常也是工作中实用性最高的知识。<span style="color:red;font-weight:500;">读了100页 K8S 文档,也不如安装一遍 K8S</span></p> <p>Kuboard 为初学者学习 Kubernetes 时设计了如下学习路径:</p> <ul><li>跟随文档 <a href="/install/install-k8s">安装 Kubernetes 单Master节点</a> 快速安装一个可以练习使用的 Kubernetes 环境,(初学者也许要花费2小时或更多)</li> <li>跟随文档 <a href="/install/install-dashboard">安装 Kuboard</a> (5分钟)</li> <li>使用 Kuboard 工作负载编辑器 <a href="/guide/example/busybox">创建 busybox</a> (10分钟)</li> <li>尝试 Kuboard 设计的其他 example <a href="/guide/index">使用 Kuboard</a></li></ul> <p>进阶路线:</p> <ul><li>在 Kubernetes 中部署 Spring Cloud 微服务应用</li></ul> <p>本文后续章节介绍了 Kuboard 工作负载编辑器的设计,如果您能够大致理解当中的概念,说明您已经完全准备好了,可以开始自己的 Kubernetes 之旅。</p> <h2 id="工作负载编辑器设计"><a href="#工作负载编辑器设计" aria-hidden="true" class="header-anchor">#</a> 工作负载编辑器设计</h2> <p> 在向 Kubernetes 集群部署应用时,开发者或者运维团队必须花大量的时间去理解 Kubernetes 中各种对象的概念,并编写 Yaml 文件去描述 Kubernetes 对象以及他们之间的关系,然而,不同的人因为经验、视角的不同,对Kubernetes 中各对象之间关系的理解并不完全一致,也因此产生了一系列问题:</p> <ul><li>由于理解的不到位,刚入门Kubernetes的技术人员在使用 Kubernetes 部署应用时经常性地受挫;</li> <li>由于理解方式的不一致,不同技术人员编写的 yaml 文件结构各不一样,降低了部署在后期的可维护性;</li> <li>由于部署数量的增加,导致 YAML 文件的数量和代码行数不断增长;</li></ul> <p> Kubernetes 官方提供的 Kubernetes Dashboard 充分意识到了 Kubernete 对象类型在种类上的多样性以及关系上的复杂性,到目前为止并没有在全功能 Dashboard 上做出过多努力,尤其是没有付出过多努力去打造工作负载的 UI 编辑器。在 Kubernetes Dashboard 中,如果想要对 Service、Deployment、StatefulSet、ConfigMap 等各种 Kubernetes 对象执行新增或者变更操作时,您必须编写 YAML 文件。从这个意义上来讲,截止到作者写这篇文章的时间点,Kubernetes 的官方 Dashboard 仍然是一个 “只读” 型 Dashboard,几乎所有的运维操作仍然需要技术人员去编写和维护冗长的 YAML 文件,并通过 kubectl 命令来完成。</p> <p> 由于 Kubernetes YAML 文件复杂性,以及开发/运维团队在多环境复制(开发环境、测试环境、准上线环境、生产环境等)方面的普遍需求,Kubernetes 社区提出了各种各样的解决方案,例如 kustomize / helm chart 等,这些解决方案在解决一个问题的同时,又在另一方面增加了复杂度,为 Kubernetes 爱好者增加了新的学习门槛。</p> <p> Kuboard 与 Kubernetes Dashboard 相同的是,架构上的简洁性。尤其是,使用 Kuboard 并不需要我们去学习和理解新的概念,而是和 Kuboard 一起,将 Kubernetes 对象中各种复杂的概念和关系梳理清楚,将各种知识点条理化,清晰化。在 Kuboard 的辅助下,轻松掌握 Kubernetes 的使用和运维,并利用 Kuboard 完成 Kubernetes 的日常运维工作。</p> <h2 id="工作负载编辑器介绍"><a href="#工作负载编辑器介绍" aria-hidden="true" class="header-anchor">#</a> 工作负载编辑器介绍</h2> <p>为了降低 Kubernetes 的学习难度和使用难度,Kuboard 对 Kubernetes 中管理的各种对象做了一个梳理,并以此为基础,设计了 Kuboard 工作负载编辑器。</p> <p>Kuboard 工作负载编辑器以下图的方式理解和管理 Kubernetes 对象。</p> <p><img src="/assets/img/image-20190722165648180.fe018998.png" alt="image-20190722165648180"></p> <p>上图中各概念与 Kuboard 工作负载编辑器界面的映射关系如下:</p> <p><img src="/assets/img/image-20190722162249531.e826dfb9.png" alt="image-20190722162249531"></p> <h3 id="_1-基本信息"><a href="#_1-基本信息" aria-hidden="true" class="header-anchor">#</a> 1. 基本信息</h3> <p>基本信息对应到 Kubernetes 的 Workload Controller,当前 Kuboard 工作负载编辑器已经支持了使用频率最高的几类 Workload Controller :</p> <ul><li>Deployment</li> <li>StatefulSet</li> <li>DaemonSet</li></ul> <blockquote><p>Kuboard 将陆续支持其他低频使用的 Controller: Garbage Collection, TTL Controller, Jobs, Cron Job。</p></blockquote> <p>Kubernetes Workload Controller 主要用于:</p> <ul><li>根据容器组模板的定义,创建和管理多个容器组</li> <li>处理容器组的复制和上线</li> <li>在集群范围内提供自修复能力</li></ul> <blockquote><p>例如:Workload Controller 起初在节点 A 上创建并运行了一个容器组 pod_a,当节点 A 出现故障不能正常工作时,Workload Controller 可以自动地在其他可用的节点上运行一个完全相同的容器组实例 pod_a' 以替代 pod_a。</p> <p>不同类型的 Workload Controller 在处理容器组时,会有各自不同的行为。</p></blockquote> <blockquote><p>请参考 https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/#pods-and-controllers</p></blockquote> <p>基本信息编辑器的界面如下图所示:</p> <p><img src="/assets/img/image-20190722172356943.9a901574.png" alt="image-20190722172356943"></p> <table><thead><tr><th>字段名称</th> <th>字段描述</th></tr></thead> <tbody><tr><td>服务类型</td> <td>即工作负载类型,<br>当前支持: Deployment、StatefulSet、DaemonSet</td></tr> <tr><td>服务分层</td> <td>决定了 Kuboard 将该工作负载展示在哪一个分层,同时,也确定了该工作负载名称的前缀,可选项有:<br>* 展现层 web、网关层 gateway、服务层 svc、持久层 db、中间件层 cloud、监控层 monitor;<br>* 默认层当前不可选择</td></tr> <tr><td>标签</td> <td>用于确定 Service 的 labelSelector、Controller 的 labels、容器组的 labels</td></tr> <tr><td>服务描述</td> <td>展示在 Kuboard 界面上的一段描述信息</td></tr> <tr><td>副本数量</td> <td>对于 Deployment 和 StatefulSet 可以填写,决定了该控制器应该维持的容器组副本的数量</td></tr></tbody></table> <h3 id="_2-数据卷"><a href="#_2-数据卷" aria-hidden="true" class="header-anchor">#</a> 2. 数据卷</h3> <p> 容器每次启动时,从镜像中初始化所有文件,后续对文件系统的修改、新增、删除操作的结果都是不能持久化的。当容器崩溃时, kubelet 重启该容器,但是原容器已经做的修改将丢失,因为每次启动容器,都是从镜像中初始化;此外,多个容器运行在同一个容器组中时,通常伴随着在不同容器之间共享文件的需求。</p> <p> Kubernetes的抽象出了数据卷 Volume 的概念,以解决上述的问题。</p> <p> <strong>Kuboard 目前支持如下类型的数据卷:</strong></p> <ul><li>NFS</li> <li>存储卷声明</li> <li>emptyDir</li> <li>配置 ConfigMap</li> <li>Secrets</li></ul> <blockquote><p>Kubernetes 支持的数据卷类型,请参考:https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes</p> <p>Kuboard 认为当前支持的数据卷类型已经满足绝大多数应用场景,目前正在添加对更多类型数据卷的支持。</p></blockquote> <p> 容器组中的不同容器都可以通过挂载点引用该容器组加载的数据卷。Kuboard 工作负载编辑中,使用如下界面定义数据卷:</p> <p><img src="/assets/img/image-20190722182005060.8e560b34.png" alt="image-20190722182005060"></p> <table><thead><tr><th>字段名称</th> <th>说明</th></tr></thead> <tbody><tr><td>数据卷名称</td> <td>如图中的 <em><strong>example-data</strong></em> 、 <em><strong>empty-dir</strong></em></td></tr> <tr><td>数据卷类型</td> <td></td></tr> <tr><td>数据卷详细信息</td> <td>不同类型的数据卷需要填写的信息不尽相同,例如<br>存储卷声明,需要选择事先已经在名称空间中创建好的存储卷声明<br>NFS,需要填写 NFS Server 的地址,以及 NFS Path</td></tr></tbody></table> <h3 id="_3-身份信息"><a href="#_3-身份信息" aria-hidden="true" class="header-anchor">#</a> 3. 身份信息</h3> <p>身份信息区域主要为容器组定义两类信息:</p> <ul><li>imagePullSecrets,容器组调用镜像仓库接口抓取镜像时所使用的用户名密码。如果您使用了私有镜像仓库,您需要在此指定镜像仓库的用户名密码;如果您使用 docker 公共仓库,则无需填写 imagePullSecrets</li> <li>ServiceAccount,容器组调用 kubernetes apiserver 时,所使用的身份信息</li></ul> <p>Kuboard 工作负载编辑器中关于身份信息的编辑界面如下所示:</p> <p><img src="/assets/img/image-20190722183329825.63739750.png" alt="image-20190722183329825"></p> <h3 id="_4-容器"><a href="#_4-容器" aria-hidden="true" class="header-anchor">#</a> 4. 容器</h3> <p>容器是我们真正应用程序镜像被加载和运行的地方,按照 Kubernetes 的设计,一个容器组 Pod 中可以包含多个容器 Container,这些容器被分为两类:</p> <ul><li>初始化容器
|
||
<ul><li>初始化容器总是执行后结束执行</li> <li>初始化容器按其定义的顺序执行,前一个初始化容器执行结束后,才开始后一个初始化容器的执行</li> <li>只有初始化容器执行成功后,容器组才启动工作容器</li> <li>请参考 https://kubernetes.io/docs/concepts/workloads/pods/init-containers/</li></ul></li> <li>工作容器
|
||
<ul><li>容器组可以包含一个或多个工作容器</li> <li>https://kubernetes.io/docs/concepts/workloads/pods/pod-overview</li></ul></li></ul> <p>Kuborad中,定义容器的界面如下图所示:</p> <p><img src="/assets/img/image-20190722183750444.973f7dfa.png" alt="image-20190722183750444"></p> <p><img src="data:image/png;base64,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" alt="image-20190722184516447"></p> <h3 id="_5-访问方式"><a href="#_5-访问方式" aria-hidden="true" class="header-anchor">#</a> 5. 访问方式</h3> <p> 访问方式,即 Kubernetes Service。</p> <blockquote><p>请参考: https://kubernetes.io/docs/concepts/services-networking/service/</p></blockquote> <p> Kuboard 中,支持 ClusterIP(集群内访问) 以及 NodePort(VPC 内访问) 两种 Service 访问方式,您也可以不为该工作负载定义 Service 访问方式。访问方式的界面如下所示:</p> <p><img src="/assets/img/image-20190722184943431.f2f72e7c.png" alt="image-20190722184943431"></p> <h3 id="_6-互联网入口"><a href="#_6-互联网入口" aria-hidden="true" class="header-anchor">#</a> 6. 互联网入口</h3> <p> 互联网入口,即 Kubernetes Ingress。</p> <blockquote><p>请参考: https://kubernetes.io/docs/concepts/services-networking/ingress/</p></blockquote> <p> Kuboard 并不限定您使用何种类型的 <a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/" target="_blank" rel="noopener noreferrer">Ingress Controller<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path 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"></path> <polygon 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"></polygon></svg></a>, 但是 <a href="/install/install-k8s">安装 Kubernetes 用于测试</a> 文档中,推荐使用的 Ingress Controller 是 <a href="https://github.com/nginxinc/kubernetes-ingress" target="_blank" rel="noopener noreferrer">Nginx-Ingress<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path 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"></path> <polygon 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"></polygon></svg></a>。</p> <p> 在您使用 Nginx-Ingress 的情况下,要想确保您能按照互联网入口中定义的域名访问您的服务,请确保以下两点:</p> <ul><li>域名解析指向 Kubernetes 集群中 Worker 节点对应的负载均衡的 IP 地址
|
||
<ul><li>如果是测试环境,也可以只指向其中一台 Worker 节点的 IP 地址</li></ul></li> <li>通过该域名,可以访问 Worker 节点的 80 端口
|
||
<ul><li>如果您启用了 HTTPS,请同时确保通过该域名可以访问 Worker 节点的 443 端口</li></ul></li></ul> <p> Kuboard 中,定义互联网入口的界面如下所示:</p> <p><img src="/assets/img/image-20190722185113938.4d31e54b.png" alt="image-20190722185113938"></p></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">更新时间: </span> <span class="time">2019-07-26 15:48:26</span></div></footer> <div class="page-nav"><p class="inner"><span class="prev">
|
||
←
|
||
<a href="/overview/why-kuboard.html" class="prev">
|
||
为什么选择 Kuboard
|
||
</a></span> <!----></p></div> <div class="bottom-description" data-v-79c95b4d>Copyright © 2019-present HuanQing Shao</div></main></div><div class="global-ui"><!----><div class="reading-progress top" data-v-7681808f><div class="progress" data-v-7681808f></div></div></div></div>
|
||
<script src="/assets/js/app.469e521d.js" defer></script><script src="/assets/js/11.85cc1d1b.js" defer></script><script src="/assets/js/2.4586c502.js" defer></script><script src="/assets/js/8.05349e1e.js" defer></script>
|
||
</body>
|
||
</html>
|