10 | Kubernetes一键部署利器:kubeadm

你好,我是张磊。今天我和你分享的主题是: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 集群的部署:

      1 # 创建一个 Master 节点

      2 $ kubeadm init

      3 

      4 # 将一个 Node 节点加入到当前集群中

      5 $ 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 准备好了安装包,所以你只需要执行:

1$ 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 文件如下所示:

1$ ls /etc/kubernetes/manifests/

2 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 --configkubeadm.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

包治结巴

https://time.geekbang.org/column/article/39712

2018/11/17

张老师,后面能讲讲怎么用二进制部署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

张应罗

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

2018-09-21

作者回复

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

2018-09-21

宝仔

etcd可以先部署,然后初始化的时候通过kubeadm.yaml指定已经部署好的etcd。高可用可以通过部署三个master节点来解决!现在有个问题,通过kubeadm部署生成的apiserver证书默认有效期是一年,官方是认为需要通过kubeadm upgrade 每年升级一次kubernetes,升级的时候也会更新证书,请问老师这个有解决方法吗?

2018-09-15

作者回复

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

2018-09-16

eden

有个开源项目kubespray,支持k8s高可用部署,利用ansible来实现,这个项目部署的集群可以用于生产吧

2018-09-14

zz@zz

kbueadm init 遇到问题的同学,可以从报错日志中获得需要的 镜像列表

- No internet connection is available so the kubelet cannot pull or findthe following control plane images:

- k8s.gcr.io/kube-apiserver-amd64:v1.11.4

- k8s.gcr.io/kube-controller-manager-amd64:v1.11.4

- k8s.gcr.io/kube-scheduler-amd64:v1.11.4

- k8s.gcr.io/etcd-amd64:3.2.18

- You can check or miligate this in beforehand with "kubeadm configimages pull" to make sure the images

或者使用如下命令

kubeadm config images list

然后使用下边的脚本拉镜像并tag成指定Google的镜像

images=(

k8s.gcr.io/kube-apiserver-amd64:v1.11.4

k8s.gcr.io/kube-controller-manager-amd64:v1.11.4

k8s.gcr.io/kube-scheduler-amd64:v1.11.4

k8s.gcr.io/kube-proxy-amd64:v1.11.4

k8s.gcr.io/pause:3.1

k8s.gcr.io/etcd-amd64:3.2.18

k8s.gcr.io/coredns:1.1.3

)

for imageName in ${images[@]} ; do

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageNamek8s.g

cr.io/$imageName

done

2018-11-03

alex

对墙经验丰富的人来了,可以用下面这个镜像

https://github.com/anjia0532/gcr.io_mirror

作者回复

你好,楼道门开一下。

一叶

我们的生产环境是二进制安装的,把安装步骤写成脚本就会方便很多,分享一个二进制安装脚本:

https://github.com/SongCF/kubesh

2018-09-23

darling

fabric8 不是Java API 操作K8s吗? 大神不知道????

2018-09-14

作者回复

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

2018-09-14

广兴

kubeadm不是也支持高可用集群搭建的吗

2018-09-14

作者回复

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

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

北卡

额,指正式版没有发布吗?

2018-09-23

作者回复

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

2018-09-23

北卡

不能直接回复作者的回复吗?

“kubeadm 高可用部署还没有GA”

GA是什么意思?

2018-09-23

作者回复

生产可用

2018-09-24

北卡

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

2018-09-23

作者回复

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容