宋净超( Jimmy Song),TalkingData 容器技术负责人,微服务和云原生应用布道者。2017 年初开始研究 Kubernetes,至目前已发表近 40 篇 Kubernetes 学习笔记。同时,他也是「 K8sMeetup 中国社区」的活跃者,见证了「 K8sMeetup 中国社区」的一路成长。
经 Jimmy Song 本人授权, 从本周开始,K8sMeetup 中国将转载他的 Kubernetes 学习笔记,由浅入深地分享他在学习过程中的收获。7 月 22 日,北京 K8S 2 周年 Meetup,Jimmy Song 也将到现场进行分享,欢迎 Kubernetes 爱好者届时参与。 前言:
这是和我一步步部署 Kubernetes 集群项目 ((fork 自 opsnull)) 中的一篇文章,下文是结合我之前部署 Kubernetes 的过程产生的 Kuberentes 环境,部署 master 节点的 kube-apiserver,kube-controller-manager 和 kube-scheduler 的过程。
Kubernetes master 节点安装
Kubernetes master 节点包含的组件: kube-apiserver kube-scheduler kube-controller-manager
目前这三个组件需要部署在同一台机器上。
kube-scheduler,kube-controller-manager 和 kube-apiserver 三者的功能紧密相关; 同时只能有一个 kube-scheduler,kube-controller-manager 进程处于工作状态,如果运行多个,则需要通过选举产生一个 leader ;
本文档记录部署一个三个节点的 Kubernetes master 集群步骤。(后续创建一个 load balancer 来代理访问 kube-apiserver 的请求)
TLS 证书文件
PEM 和 token.csv 证书文件我们在 TLS 证书和秘钥这一步中已经创建过了,我们再检查一下。
下载最新版本的二进制文件
有两种下载方式
方式一: 从 github release 页面下载发布版 tarball,解压后再执行下载脚本
方式二: 从 CHANGELOG 页面下载 client 或 servertarball 文件
server 的 tarball kubernetes-server-linux-amd64.tar.gz 已经包含了 client ( kubectl )二进制文件,所以不用单独下载 kubernetes-client-linux-amd64.tar.gz 文件;
将二进制文件拷贝到指定路径
配置和启动 kube-apiserver
创建 kube-apiserver 的 service 配置文件
serivce 配置 /usr/lib/systemd/system/kube-apiserver.service 文件内容:
/etc/kubernetes/config 文件的内容为:
该配置文件同时被 kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy 使用。
apiserver 配置 /etc/kubernetes/apiserver 文件内容为:
--authorization-mode=RBAC 指定在安全端口使用 RBAC 授权模式,拒绝未通过授权的请求; kube-scheduler、kube-controller-manager 一般和 kube-apiserver 部署在同一台机器上,它们使用非安全端口和 kube-apiserver 通信; kubelet、kube-proxy、kubectl 部署在其它 Node 节点上,如果通过安全端口访问 kube-apiserver,则必须先通过 TLS 证书认证,再通过 RBAC 授权; kube-proxy、kubectl 通过在使用的证书里指定相关的 User、Group 来达到通过 RBAC 授权的目的; 如果使用了 kubelet TLS Boostrap 机制,则不能再指定 --kubelet-certificate-authority,--kubelet-client-certificate 和--kubelet-client-key 选项,否则后续 kube-apiserver 校验 kubelet 证书时出现 "x509: certificate signed by unknown authority" 错误; --admission-control 值必须包含 ServiceAccount ; --bind-address 不能为 127.0.0.1 ; runtime-config 配置为 rbac.authorization.k8s.io/v1beta1,表示运行时的 apiVersion ; --service-cluster-ip-range 指定 Service Cluster IP 地址段,该地址段不能路由可达; 缺省情况下 Kubernetes 对象保存在 etcd /registry 路径下,可以通过 --etcd-prefix 参数进行调整;
完整 unit 见 kube-apiserver.service
启动 kube-apiserver
配置和启动 kube-controller-manager
创建 kube-controller-manager 的 serivce 配置文件
文件路径 /usr/lib/systemd/system/kube-controller-manager.service
配置文件 /etc/kubernetes/controller-manager。
--service-cluster-ip-range 参数指定 Cluster 中 Service 的 CIDR 范围,该网络在各 Node 间必须路由不可达,必须和 kube-apiserver 中的参数一致; --cluster-signing-* 指定的证书和私钥文件用来签名为 TLS BootStrap 创建的证书和私钥; --root-ca-file 用来对 kube-apiserver 证书进行校验,指定该参数后,才会在 Pod 容器的 ServiceAccount 中放置该 CA 证书文件; --address 值必须为 127.0.0.1,因为当前 kube-apiserver 期望 scheduler 和 controller-manager 在同一台机器,否则:
参考: https://github.com/kubernetes-incubator/bootkube/issues/64
完整配置见 kube-controller-manager.service
启动 kube-controller-manager
配置和启动 kube - scheduler
创建 kube-scheduler 的 serivce 配置文件
文件路径 /usr/lib/systemd/system/kube-scheduler.serivce。
配置文件 /etc/kubernetes/scheduler。
--address 值必须为 127.0.0.1,因为当前 kube-apiserver 期望 scheduler 和 controller-manager 在同一台机器;
完整见: kube-scheduler.service
验证 master 节点功能
后记
当时在配置过程中遇到了问题 TLS 认证相关的问题,其实就是因为配置 apiserver 时候 etcd 的协议写成了 http 导致的,应该是用 https。
才云科技的唐继元分享过 Kubernetes Master High Availability 高级实践。究竟如何实现 Kubernetes master 的高可用还需要继续探索。
原文链接: https://github.com/rootsongjc/kubernetes-handbook/blob/master/practice/master-installation.md
专家有话说
文章提到了 K8S master 节点上三个组件如何配置和部署,虽然我们在三台机器上都部署了 K8S master 三大组件,但是 3 大部署了 master 的机器如何体现高可用,又如何暴露给用户访问呢?其实,我们需要加一个 haproxy 作为 master 高可用的入口。那么无论 kubectl 还是 K8S node 上的 kubelet 要访问 apiserver,都通过 haproxy 间接访问,haproxy 实现了 master 的高可用和负载均衡。后续才云( Caicloud )会发一篇更具体的高可用方案,包含自动化部署脚本,让用户实现一键部署,敬请期待。
——才云技术经理 唐继元
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.