10 | Kubernetes一键部署利器:kubeadm

10 | Kubernetes一键部署利器:kubeadm

朗读人:张磊    17′20′′ | 7.95M

你好,我是张磊。今天我和你分享的主题是:Kubernetes 一键部署利器之 kubeadm。

通过前面几篇文章的内容,我其实阐述了这样一个思想:要真正发挥容器技术的实力,你就不能仅仅局限于对 Linux 容器本身的钻研和使用。

这些知识更适合作为你的技术储备,以便在需要的时候可以帮你更快的定位问题,并解决问题。

而更深入的学习容器技术的关键在于,如何使用这些技术来“容器化”你的应用。

比如,我们的应用既可能是 Java Web 和 MySQL 这样的组合,也可能是 Cassandra 这样的分布式系统。而要使用容器把后者运行起来,你单单通过 Docker 把一个 Cassandra 镜像跑起来是没用的。

要把 Cassandra 应用容器化的关键,在于如何处理好这些 Cassandra 容器之间的编排关系。比如,哪些 Cassandra 容器是主,哪些是从?主从容器如何区分?它们之间又如何进行自动发现和通信?Cassandra 容器的持久化数据又如何保持,等等。

这也是为什么我们要反复强调 Kubernetes 项目的主要原因:这个项目体现出来的容器化“表达能力”,具有独有的先进性和完备性。这就使得它不仅能运行 Java Web 与 MySQL 这样的常规组合,还能够处理 Cassandra 容器集群等复杂编排问题。所以,对这种编排能力的剖析、解读和最佳实践,将是本专栏最重要的一部分内容。

不过,万事开头难。

作为一个典型的分布式项目,Kubernetes 的部署一直以来都是挡在初学者前面的一只“拦路虎”。尤其是在 Kubernetes 项目发布初期,它的部署完全要依靠一堆由社区维护的脚本。

其实,Kubernetes 作为一个 Golang 项目,已经免去了很多类似于 Python 项目要安装语言级别依赖的麻烦。但是,除了将各个组件编译成二进制文件外,用户还要负责为这些二进制文件编写对应的配置文件、配置自启动脚本,以及为 kube-apiserver 配置授权文件等等诸多运维工作。

目前,各大云厂商最常用的部署的方法,是使用 SaltStack、Ansible 等运维工具自动化地执行这些步骤。

但即使这样,这个部署过程依然非常繁琐。因为,SaltStack 这类专业运维工具本身的学习成本,就可能比 Kubernetes 项目还要高。

难道 Kubernetes 项目就没有简单的部署方法了吗?

这个问题,在 Kubernetes 社区里一直没有得到足够重视。直到 2017 年,在志愿者的推动下,社区才终于发起了一个独立的部署工具,名叫:kubeadm

这个项目的目的,就是要让用户能够通过这样两条指令完成一个 Kubernetes 集群的部署:

# 创建一个 Master 节点
$ kubeadm init
# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master 节点的 IP 和端口 >
复制代码

是不是非常方便呢?

不过,你可能也会有所顾虑:Kubernetes 的功能那么多,这样一键部署出来的集群,能用于生产环境吗?

为了回答这个问题,在今天这篇文章,我就先和你介绍一下 kubeadm 的工作原理吧。

kubeadm 的工作原理

在上一篇文章《从容器到容器云:谈谈 Kubernetes 的本质》中,我已经详细介绍了 Kubernetes 的架构和它的组件。在部署时,它的每一个组件都是一个需要被执行的、单独的二进制文件。所以不难想象,SaltStack 这样的运维工具或者由社区维护的脚本的功能,就是要把这些二进制文件传输到指定的机器当中,然后编写控制脚本来启停这些组件。

不过,在理解了容器技术之后,你可能已经萌生出了这样一个想法,为什么不用容器部署 Kubernetes 呢?

这样,我只要给每个 Kubernetes 组件做一个容器镜像,然后在每台宿主机上用 docker run 指令启动这些组件容器,部署不就完成了吗?

事实上,在 Kubernetes 早期的部署脚本里,确实有一个脚本就是用 Docker 部署 Kubernetes 项目的,这个脚本相比于 SaltStack 等的部署方式,也的确简单了不少。

但是,这样做会带来一个很麻烦的问题,即:如何容器化 kubelet。

我在上一篇文章中,已经提到 kubelet 是 Kubernetes 项目用来操作 Docker 等容器运行时的核心组件。可是,除了跟容器运行时打交道外,kubelet 在配置容器网络、管理容器数据卷时,都需要直接操作宿主机。

而如果现在 kubelet 本身就运行在一个容器里,那么直接操作宿主机就会变得很麻烦。对于网络配置来说还好,kubelet 容器可以通过不开启 Network Namespace(即 Docker 的 host network 模式)的方式,直接共享宿主机的网络栈。可是,要让 kubelet 隔着容器的 Mount Namespace 和文件系统,操作宿主机的文件系统,就有点儿困难了。

比如,如果用户想要使用 NFS 做容器的持久化数据卷,那么 kubelet 就需要在容器进行绑定挂载前,在宿主机的指定目录上,先挂载 NFS 的远程目录。

可是,这时候问题来了。由于现在 kubelet 是运行在容器里的,这就意味着它要做的这个“mount -F nfs”命令,被隔离在了一个单独的 Mount Namespace 中。即,kubelet 做的挂载操作,不能被“传播”到宿主机上。

对于这个问题,有人说,可以使用 setns() 系统调用,在宿主机的 Mount Namespace 中执行这些挂载操作;也有人说,应该让 Docker 支持一个–mnt=host 的参数。

但是,到目前为止,在容器里运行 kubelet,依然没有很好的解决办法,我也不推荐你用容器去部署 Kubernetes 项目。

正因为如此,kubeadm 选择了一种妥协方案:

把 kubelet 直接运行在宿主机上,然后使用容器部署其他的 Kubernetes 组件。

所以,你使用 kubeadm 的第一步,是在机器上手动安装 kubeadm、kubelet 和 kubectl 这三个二进制文件。当然,kubeadm 的作者已经为各个发行版的 Linux 准备好了安装包,所以你只需要执行:

$ apt-get install kubeadm
复制代码

就可以了。

接下来,你就可以使用“kubeadm init”部署 Master 节点了。

kubeadm init 的工作流程

当你执行 kubeadm init 指令后,kubeadm 首先要做的,是一系列的检查工作,以确定这台机器可以用来部署 Kubernetes。这一步检查,我们称为“Preflight Checks”,它可以为你省掉很多后续的麻烦。

其实,Preflight Checks 包括了很多方面,比如:

  • Linux 内核的版本必须是否是 3.10 以上?
  • Linux Cgroups 模块是否可用?
  • 机器的 hostname 是否标准?在 Kubernetes 项目里,机器的名字以及一切存储在 Etcd 中的 API 对象,都必须使用标准的 DNS 命名(RFC 1123)。
  • 用户安装的 kubeadm 和 kubelet 的版本是否匹配?
  • 机器上是不是已经安装了 Kubernetes 的二进制文件?
  • Kubernetes 的工作端口 10250/10251/10252 端口是不是已经被占用?
  • ip、mount 等 Linux 指令是否存在?
  • Docker 是否已经安装?
  • ……

在通过了 Preflight Checks 之后,kubeadm 要为你做的,是生成 Kubernetes 对外提供服务所需的各种证书和对应的目录。

Kubernetes 对外提供服务时,除非专门开启“不安全模式”,否则都要通过 HTTPS 才能访问 kube-apiserver。这就需要为 Kubernetes 集群配置好证书文件。

kubeadm 为 Kubernetes 项目生成的证书文件都放在 Master 节点的 /etc/kubernetes/pki 目录下。在这个目录下,最主要的证书文件是 ca.crt 和对应的私钥 ca.key。

此外,用户使用 kubectl 获取容器日志等 streaming 操作时,需要通过 kube-apiserver 向 kubelet 发起请求,这个连接也必须是安全的。kubeadm 为这一步生成的是 apiserver-kubelet-client.crt 文件,对应的私钥是 apiserver-kubelet-client.key。

除此之外,Kubernetes 集群中还有 Aggregate APIServer 等特性,也需要用到专门的证书,这里我就不再一一列举了。需要指出的是,你可以选择不让 kubeadm 为你生成这些证书,而是拷贝现有的证书到如下证书的目录里:

/etc/kubernetes/pki/ca.{crt,key}
复制代码

这时,kubeadm 就会跳过证书生成的步骤,把它完全交给用户处理。

证书生成后,kubeadm 接下来会为其他组件生成访问 kube-apiserver 所需的配置文件。这些文件的路径是:/etc/kubernetes/xxx.conf:

ls /etc/kubernetes/
admin.conf controller-manager.conf kubelet.conf scheduler.conf
复制代码

这些文件里面记录的是,当前这个 Master 节点的服务器地址、监听端口、证书目录等信息。这样,对应的客户端(比如 scheduler,kubelet 等),可以直接加载相应的文件,使用里面的信息与 kube-apiserver 建立安全连接。

接下来,kubeadm 会为 Master 组件生成 Pod 配置文件。我已经在上一篇文章中和你介绍过 Kubernetes 有三个 Master 组件 kube-apiserver、kube-controller-manager、kube-scheduler,而它们都会被使用 Pod 的方式部署起来。

你可能会有些疑问:这时,Kubernetes 集群尚不存在,难道 kubeadm 会直接执行 docker run 来启动这些容器吗?

当然不是。

在 Kubernetes 中,有一种特殊的容器启动方法叫做“Static Pod”。它允许你把要部署的 Pod 的 YAML 文件放在一个指定的目录里。这样,当这台机器上的 kubelet 启动时,它会自动检查这个目录,加载所有的 Pod YAML 文件,然后在这台机器上启动它们。

从这一点也可以看出,kubelet 在 Kubernetes 项目中的地位非常高,在设计上它就是一个完全独立的组件,而其他 Master 组件,则更像是辅助性的系统容器。

在 kubeadm 中,Master 组件的 YAML 文件会被生成在 /etc/kubernetes/manifests 路径下。比如,kube-apiserver.yaml:

apiVersion: v1
kind: Pod
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
- --authorization-mode=Node,RBAC
- --runtime-config=api/all=true
- --advertise-address=10.168.0.2
...
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
image: k8s.gcr.io/kube-apiserver-amd64:v1.11.1
imagePullPolicy: IfNotPresent
livenessProbe:
...
name: kube-apiserver
resources:
requests:
cpu: 250m
volumeMounts:
- mountPath: /usr/share/ca-certificates
name: usr-share-ca-certificates
readOnly: true
...
hostNetwork: true
priorityClassName: system-cluster-critical
volumes:
- hostPath:
path: /etc/ca-certificates
type: DirectoryOrCreate
name: etc-ca-certificates
...
复制代码

关于一个 Pod 的 YAML 文件怎么写、里面的字段如何解读,我会在后续专门的文章中为你详细分析。在这里,你只需要关注这样几个信息:

  1. 这个 Pod 里只定义了一个容器,它使用的镜像是:k8s.gcr.io/kube-apiserver-amd64:v1.11.1 。这个镜像是 Kubernetes 官方维护的一个组件镜像。

  2. 这个容器的启动命令(commands)是 kube-apiserver --authorization-mode=Node,RBAC …,这样一句非常长的命令。其实,它就是容器里 kube-apiserver 这个二进制文件再加上指定的配置参数而已。

  3. 如果你要修改一个已有集群的 kube-apiserver 的配置,需要修改这个 YAML 文件。

  4. 这些组件的参数也可以在部署时指定,我很快就会讲解到。

在这一步完成后,kubeadm 还会再生成一个 Etcd 的 Pod YAML 文件,用来通过同样的 Static Pod 的方式启动 Etcd。所以,最后 Master 组件的 Pod YAML 文件如下所示:

$ ls /etc/kubernetes/manifests/
etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml
复制代码

而一旦这些 YAML 文件出现在被 kubelet 监视的 /etc/kubernetes/manifests 目录下,kubelet 就会自动创建这些 YAML 文件中定义的 Pod,即 Master 组件的容器。

Master 容器启动后,kubeadm 会通过检查 localhost:6443/healthz 这个 Master 组件的健康检查 URL,等待 Master 组件完全运行起来。

然后,kubeadm 就会为集群生成一个 bootstrap token。在后面,只要持有这个 token,任何一个安装了 kubelet 和 kubadm 的节点,都可以通过 kubeadm join 加入到这个集群当中。

这个 token 的值和使用方法会,会在 kubeadm init 结束后被打印出来。

在 token 生成之后,kubeadm 会将 ca.crt 等 Master 节点的重要信息,通过 ConfigMap 的方式保存在 Etcd 当中,供后续部署 Node 节点使用。这个 ConfigMap 的名字是 cluster-info。

kubeadm init 的最后一步,就是安装默认插件。Kubernetes 默认 kube-proxy 和 DNS 这两个插件是必须安装的。它们分别用来提供整个集群的服务发现和 DNS 功能。其实,这两个插件也只是两个容器镜像而已,所以 kubeadm 只要用 Kubernetes 客户端创建两个 Pod 就可以了。

kubeadm join 的工作流程

这个流程其实非常简单,kubeadm init 生成 bootstrap token 之后,你就可以在任意一台安装了 kubelet 和 kubeadm 的机器上执行 kubeadm join 了。

可是,为什么执行 kubeadm join 需要这样一个 token 呢?

因为,任何一台机器想要成为 Kubernetes 集群中的一个节点,就必须在集群的 kube-apiserver 上注册。可是,要想跟 apiserver 打交道,这台机器就必须要获取到相应的证书文件(CA 文件)。可是,为了能够一键安装,我们就不能让用户去 Master 节点上手动拷贝这些文件。

所以,kubeadm 至少需要发起一次“不安全模式”的访问到 kube-apiserver,从而拿到保存在 ConfigMap 中的 cluster-info(它保存了 APIServer 的授权信息)。而 bootstrap token,扮演的就是这个过程中的安全验证的角色。

只要有了 cluster-info 里的 kube-apiserver 的地址、端口、证书,kubelet 就可以以“安全模式”连接到 apiserver 上,这样一个新的节点就部署完成了。

接下来,你只要在其他节点上重复这个指令就可以了。

配置 kubeadm 的部署参数

我在前面讲解了 kubeadm 部署 Kubernetes 集群最关键的两个步骤,kubeadm init 和 kubeadm join。相信你一定会有这样的疑问:kubeadm 确实简单易用,可是我又该如何定制我的集群组件参数呢?

比如,我要指定 kube-apiserver 的启动参数,该怎么办?

在这里,我强烈推荐你在使用 kubeadm init 部署 Master 节点时,使用下面这条指令:

$ kubeadm init --config kubeadm.yaml
复制代码

这时,你就可以给 kubeadm 提供一个 YAML 文件(比如,kubeadm.yaml),它的内容如下所示(我仅列举了主要部分):

apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.0
api:
advertiseAddress: 192.168.0.102
bindPort: 6443
...
etcd:
local:
dataDir: /var/lib/etcd
image: ""
imageRepository: k8s.gcr.io
kubeProxy:
config:
bindAddress: 0.0.0.0
...
kubeletConfiguration:
baseConfig:
address: 0.0.0.0
...
networking:
dnsDomain: cluster.local
podSubnet: ""
serviceSubnet: 10.96.0.0/12
nodeRegistration:
criSocket: /var/run/dockershim.sock
...
复制代码

通过制定这样一个部署参数配置文件,你就可以很方便地在这个文件里填写各种自定义的部署参数了。比如,我现在要指定 kube-apiserver 的参数,那么我只要在这个文件里加上这样一段信息:

...
apiServerExtraArgs:
advertise-address: 192.168.0.103
anonymous-auth: false
enable-admission-plugins: AlwaysPullImages,DefaultStorageClass
audit-log-path: /home/johndoe/audit.log
复制代码

然后,kubeadm 就会使用上面这些信息替换 /etc/kubernetes/manifests/kube-apiserver.yaml 里的 command 字段里的参数了。

而这个 YAML 文件提供的可配置项远不止这些。比如,你还可以修改 kubelet 和 kube-proxy 的配置,修改 Kubernetes 使用的基础镜像的 URL(默认的k8s.gcr.io/xxx镜像 URL 在国内访问是有困难的),指定自己的证书文件,指定特殊的容器运行时等等。这些配置项,就留给你在后续实践中探索了。

总结

在今天的这次分享中,我重点介绍了 kubeadm 这个部署工具的工作原理和使用方法。紧接着,我会在下一篇文章中,使用它一步步地部署一个完整的 Kubernetes 集群。

从今天的分享中,你可以看到,kubeadm 的设计非常简洁。并且,它在实现每一步部署功能时,都在最大程度地重用 Kubernetes 已有的功能,这也就使得我们在使用 kubeadm 部署 Kubernetes 项目时,非常有“原生”的感觉,一点都不会感到突兀。

而 kubeadm 的源代码,直接就在 kubernetes/cmd/kubeadm 目录下,是 Kubernetes 项目的一部分。其中,app/phases 文件夹下的代码,对应的就是我在这篇文章中详细介绍的每一个具体步骤。

看到这里,你可能会猜想,kubeadm 的作者一定是 Google 公司的某个“大神”吧。

实际上,kubeadm 几乎完全是一位高中生的作品。他叫 Lucas Käldström,芬兰人,今年只有 18 岁。kubeadm,是他 17 岁时用业余时间完成的一个社区项目。

所以说,开源社区的魅力也在于此:一个成功的开源项目,总能够吸引到全世界最厉害的贡献者参与其中。尽管参与者的总体水平参差不齐,而且频繁的开源活动又显得杂乱无章难以管控,但一个有足够热度的社区最终的收敛方向,却一定是代码越来越完善、Bug 越来越少、功能越来越强大。

最后,我再来回答一下我在今天这次分享开始提到的问题:kubeadm 能够用于生产环境吗?

到目前为止(2018 年 9 月),这个问题的答案是:不能。

因为 kubeadm 目前最欠缺的是,一键部署一个高可用的 Kubernetes 集群,即:Etcd、Master 组件都应该是多节点集群,而不是现在这样的单点。这,当然也正是 kubeadm 接下来发展的主要方向。

另一方面,Lucas 也正在积极地把 kubeadm phases 开放给用户,即:用户可以更加自由地定制 kubeadm 的每一个部署步骤。这些举措,都可以让这个项目更加完善,我对它的发展走向也充满了信心。

当然,如果你有部署规模化生产环境的需求,我推荐使用kops或者 SaltStack 这样更复杂的部署工具。但,在本专栏接下来的讲解中,我都会以 kubeadm 为依据进行讲述。

  • 一方面,作为 Kubernetes 项目的原生部署工具,kubeadm 对 Kubernetes 项目特性的使用和集成,确实要比其他项目“技高一筹”,非常值得我们学习和借鉴;
  • 另一方面,kubeadm 的部署方法,不会涉及到太多的运维工作,也不需要我们额外学习复杂的部署工具。而它部署的 Kubernetes 集群,跟一个完全使用二进制文件搭建起来的集群几乎没有任何区别。

因此,使用 kubeadm 去部署一个 Kubernetes 集群,对于你理解 Kubernetes 组件的工作方式和架构,最好不过了。

思考题

  1. 在 Linux 上为一个类似 kube-apiserver 的 Web Server 制作证书,你知道可以用哪些工具实现吗?

  2. 回忆一下我在前面文章中分享的 Kubernetes 架构,你能够说出 Kubernetes 各个功能组件之间(包含 Etcd),都有哪些建立连接或者调用的方式吗?(比如:HTTP/HTTPS,远程调用等等)

感谢你的收听,欢迎你给我留言,也欢迎分享给更多的朋友一起阅读。

版权归极客邦科技所有,未经许可不得转载

精选留言

  • Antergone
    有一个ansible playbook可以推荐给大家。
    https://github.com/gjmzj/kubeasz
    初学者可以跟着一步步看原理,后期还可以自己定制化。主要是容易产生兴趣。
    2018-09-14
  • MiracleWong
    我也补充一个可用于部署生产级别的Kubernetes的开源项目:https://github.com/kubernetes-incubator/kubespray 我们公司正在使用。
    2018-09-16
  • yandd
    推荐个k8s实验平台 https://console.magicsandbox.com,可能需要fan qiang才能访问
    2018-09-15
  • 包治结巴
    张老师,后面能讲讲怎么用二进制部署kubernetes吗?毕竟kubeadm不适用于生产环境,用二进制部署还是挺复杂的,恳请老师不吝讲解一下吧。
    2018-09-14
    作者回复

    我不建议直接使用二进制文件部署。而建议你花时间了解一下kubeadm的高可用部署,它现在已经初具雏形了。宝贵的时间应该用在刀刃上。

    2018-09-14

  • eden
    一周更新三章,有点迫不及待了。不过讲得确实不错,期待后面更精彩的内容。想请教一个问题,你怎么看待openstack和k8s的关系,哪个技术门槛更高,为什么现在公司更倾向于用k8s来实现自己的云,而openstack有被k8s取代的趋势。
    2018-09-14
    作者回复

    当然是openstack门槛更高。90%用户要的是paas。

    2018-09-14

  • Geek_700d17
    第一时间阅读更新,有种追剧的感觉!!!
    2018-09-14
  • 宝仔
    etcd可以先部署,然后初始化的时候通过kubeadm.yaml指定已经部署好的etcd。高可用可以通过部署三个master节点来解决!现在有个问题,通过kubeadm部署生成的apiserver证书默认有效期是一年,官方是认为需要通过kubeadm upgrade 每年升级一次kubernetes,升级的时候也会更新证书,请问老师这个有解决方法吗?
    2018-09-15
    作者回复

    HA的etcd也是可以用kubeadm部署的,当然,external etcd有助于你自己做运维。你可以直接改证书生成的步骤,但我当然推荐你执行upgrade,这个操作是必须的。

    2018-09-16

  • 张应罗
    其实国内同学们用kubeadm安装集群最大的拦路虎在于有几个镜像没法下载,我建议大家先手动把镜像pull 下来,从阿里的镜像源上,然后tag成安装所需的镜像名称,这样你发现安装过程会异常顺利
    2018-09-21
    作者回复

    没错。kubeadm拉取镜像的url是可配置的。

    2018-09-21

  • darling
    fabric8 不是Java API 操作K8s吗? 大神不知道????
    2018-09-14
    作者回复

    Java只有大学交作业的时候用过……

    2018-09-14

  • 广兴
    kubeadm不是也支持高可用集群搭建的吗
    2018-09-14
    作者回复

    这个特性还没有完全release ,也就是GA

    2018-09-14

  • eden
    有个开源项目kubespray,支持k8s高可用部署,利用ansible来实现,这个项目部署的集群可以用于生产吧
    2018-09-14
  • pytimer
    Kubernetes文档上现在有关于使用kubeadm部署高可用集群的说明,是不是说明可以使用kubeadm结合saltstack、ansible进行生产上的部署?
    2018-09-14
    作者回复

    是的,kubeadm的高可用部署应该很快就能发布了。

    2018-09-14

  • pytimer
    制作证书的工具: cfssl openssl easyrsa
    2018-09-14
    作者回复

    赞。而是这些工具的共同点就是,难用,不够傻瓜……

    2018-09-14

  • asdf100
    admin.conf 这个证书配置文件 是不是etcd 连接api server 时使用?
    2018-09-29
  • alex
    对墙经验丰富的人来了,可以用下面这个镜像
    https://github.com/anjia0532/gcr.io_mirror
    2018-09-26
    作者回复

    你好,楼道门开一下。

    2018-09-27

  • 北卡
    额,指正式版没有发布吗?
    2018-09-23
    作者回复

    对的,不过大功能已经确定了,不必担心,流程不会有太多变化

    2018-09-23

  • 北卡
    kubeadm可以搭建高可用集群,实际上我们现在的生产环境就是使用kubeadm搭建的。
    只是kubeadm搭建高可用集群如果完全按照官方文档来,它生成的的证书只有一年期限。所以需要自己提前做好证书。
    2018-09-23
    作者回复

    需要注意高可用部署还没有GA,有很多问题亟待解决。证书在升级的时候会更新的。

    2018-09-23

  • Jeff.W
    试用Rancher搭建过一个环境,感觉过程和kubeadm有些类似,主节点初始化生成token,其它节点通过token来进行join,而且是图形化。对于部署、运维能力都有限的中小企业来说,是否可以考虑这些非原生的部署方案?甚至是否可以考虑docker swarm呢?麻烦给个建议。
    2018-09-16
    作者回复

    rancher现在就是kubernetes 啊,而docker swarm就不必尝试了,人家docker公司自己都放弃了

    2018-09-16

  • ☆ 微~光 ☆
    最近一直在努力学习k8s,通过自己提前的学习加上老师现在的课程,感觉自己理解的越来越深刻了,很期能够快速更新后面的课程内容!
    2018-09-16
  • 志远
    kubernetes 原来是一个芬兰的高中生写的,不禁让我想起祖师爷 linus 也是芬兰人,哎~
    2018-09-15
  • dragon
    Kubernetes 集群中的Aggregate APIServer 等特性,也需要用到专门的证书吗?还是直接拷贝kube-apiserver带证书就可以?通用吗。 证书这块有点不太懂
    2018-09-14
    作者回复

    专门的证书, kubeadm会为你生成,自己手动做也可以

    2018-09-16

  • darling
    什么时候讲到fabric8啊? 最近准备升级fabric8 4.xx 不知道有没有坑
    2018-09-14
    作者回复

    我都不知道这个是啥……

    2018-09-14

  • 乐生
    apt-get install kubeadm
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    E: Unable to locate package kubeadm

    Ubuntu 18.04.1 LTS

    2018-10-18
  • 老师你好,不太明白为什么"kubelet 就需要在容器进行绑定挂载前,在宿主机的指定目录上,先挂载 NFS 的远程目录。"这句话。我的理解是,只要做为nfs的client node跟nfs server 网络通不就行了,为啥一定要考虑能不能在宿主机上"传播"呢?期待老师的回复,非常感谢!
    2018-10-14
    作者回复

    nfs是需要挂载在宿主机上才能用的。

    2018-10-15

  • shaoboai
    请问下,在阿里云上部署高可用的k8s推荐什么方案?如果是单节点部署,最多可管理多少node
    2018-10-12
    作者回复

    那得问阿里云去咯

    2018-10-12

  • 女生打
    個人目前使用 Rancher 2 來部署 K8s
    但是 Rancher 的 kubelet 是容器化的
    跟 kubeadm 不一樣
    請問這兩個的效能跟侷限性 有比較過嗎?
    2018-10-12
    作者回复

    不建议把kubelet放容器里

    2018-10-12

  • runner
    按照步骤搭建的服务,容器间可以互相访问,在节点curl容器,或服务都提示没有到主机的路由。
    而且 coredns 服务 日志 "Liveness probe failed: Get http://10.32.0.8:8080/health: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)"
    这是什么原因啊?
    2018-10-12
    作者回复

    重新创建一下weave试试?

    2018-10-12

  • kyleqian
    终于知道apiServerExtraArgs到底在哪里加了,想改生成的服务的端口范围,之前一直没找到...
    2018-09-26
  • 胖梁
    docker swarm, swarmkit, swarm mode, 三者傻傻分不清楚
    2018-09-24
    作者回复

    swamr是docker三件套的一员,已经被放弃。swarmtkit就是docker swarm mode的实现方法。

    2018-09-24

  • via
    您好,在安装过程出现这种问题,要怎么处理?谢谢。
    [kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused.
    2018-09-23
  • maojing
    楼主在这里有点鄙视swarm了,swarm在一定程度上可以解决很多问题。没有最好的,只有最合适的
    2018-09-23
    作者回复

    Windows server简单易用,界面友好,一直都它的受众和细分市场,但你还是会毫不犹豫的选择Linux server。为什么呢?

    基础设施这件事情,一旦做出选择,整个公司就载进去了。

    这种场合下,为了政治正确强调“只有最合适的”,在我看来,是不负责任的。

    2018-09-24

  • 北卡
    不能直接回复作者的回复吗?
    “kubeadm 高可用部署还没有GA”
    GA是什么意思?
    2018-09-23
    作者回复

    生产可用

    2018-09-24

  • 一叶
    我们的生产环境是二进制安装的,把安装步骤写成脚本就会方便很多,分享一个二进制安装脚本:
    https://github.com/SongCF/kubesh
    2018-09-23
  • blackpiglet
    1. Linux 下生成证书,主流的选择应该是 OpenSSL,还可以使用 GnuGPG,或者 keybase。
    2. Kubernetes 组件之间的交互方式:HTTP/HTTPS、gRPC、DNS、系统调用等。
    2018-09-20
    作者回复

    看来是搞过证书啊

    2018-09-20

  • 胖梁
    放弃的是docker swarm, swarm mode还在持续,而且最新版也吸收了不少k8s的理念
    2018-09-19
    作者回复

    swarmkit这状态跟swarm没啥区别……负责人离职都已经一年多了

    2018-09-24

  • 周娄子
    kubeadm这个项目非常棒,简化kubernetes的安装,在我做整个运维流程的时候借鉴了很多他的做法。但是从运维角度来看,我们是从Creating a Custom Cluster from Scratch这个文档开始的,虽然比较麻烦,但是收益很大。
    2018-09-18
    作者回复

    越原始的办法肯定越好,kubeadm是个折衷

    2018-09-18

  • 江宇霆
    等更新好像以前等小说
    2018-09-17
  • 余小坝
    请问老师,如果现在我的master节点的网段是172.18.196...,可以把一个网段为192.168.199..的节点加入都kubernetes集群中吗?
    2018-09-15
    作者回复

    能互通就行,但你要注意各个组件监听的网卡是哪个

    2018-09-16

  • 陈宇清
    join默认会变成worker节点。如何通过kubeadm添加多个master节点的HA模式呢?
    2018-09-14
    作者回复

    那就得用kubeadm的高可用部署了,这个刚发布没多久

    2018-09-16

  • lpf190
    又更深的熟悉了部署过程,如果用rancher2.0来部署k8s,用于生产应该没什么问题吧?
    2018-09-14
    作者回复

    商业产品一般有商业支持,问题不大

    2018-09-14

  • 广兴
    老师,您好,我现在对公有云、私有云、容器云之间的区别和联系不太清楚,网上查了些资料还上没搞清楚,能帮忙简单描述下吗
    2018-09-14
    作者回复

    放公网上给别人用的,放私网里给自己用的。提供容器服务的。

    2018-09-14

  • huan
    这篇实践起来困难很多了,主要是碰到各种墙,我是在阿里云中,在digitalocean 就顺畅很多
    2018-09-14
    作者回复

    GFW的问题可能读者比我的经验更丰富……

    2018-09-14

  • Geek_700d17
    专门讲了kubeadm,个人觉着rancher rke更合适用来搭建测试环境
    2018-09-14
    作者回复

    不推荐给初学者非原生的管理工具,得不偿失。而且往往替你接管太多的东西。

    2018-09-14