
如何在openEuler树莓派镜像上部署k8s+iSula集群(上篇)
在11.14号的开源软件供应链2020峰会上,笔者在openEuler展台展示了如何在树莓派上用k8s部署容器集群,树莓派操作系统为openEuler社区在9月份发布的20.09版本,容器为iSula;下面就带大家使用二进制包在树莓派上完成这些有趣的尝试。
01集群规划
环境建议至少两台Master节点,两台Node节点;Etcd数据库可直接部署在Master或Node节点,机器比较充足的话,可以部署在单独的节点上。
本次我们要部署的集群是多Master高可靠性集群,包含3个Master,3个Node;在这6个节点中部署3个etcd数据库节点。集群拓扑图如下所示:
集群规划如下:
02环境准备
接下来将基于二进制包的方式,手动部署每个组件,来组成k8s高可用集群;首先是每台树莓派的操作系统镜像安装及配置初始化。
2.1刷写树莓派镜像
我们需要给每个树莓派安装适合树莓派平台的openEuler镜像,镜像获取及相关操作可以参考openEuler社区里的raspberrypi sig组指引:
https://gitee.com/openeuler/raspberrypi
2.2环境初始化
<1> 关闭防火墙
<2> 关闭selinux
<3> 关闭swap
<4> 添加host信息
更改本节点主机名,拿k8s-master1为例,其他节点类似:
<5> 同步系统时间
各个节点之间需保持时间一致,因为自签证书是根据时间校验证书有效性,如果时间不一致,将校验不通过。
联网情况可使用如下命令(树莓派上ntpdate需要安装)
如果不能联外网可使用 date 命令设置时间
03部署Etcd集群
3.1自签证书
k8s集群安装配置过程中,会使用各种证书,目的是为了加强集群安全性。k8s提供了基于 CA签名的双向数字证书认证方式和简单的基于http base或token的认证方式,其中CA 证书方式的安全性最高。每个k8s集群都有一个集群根证书颁发机构(CA),集群中的组件通常使用CA来验证API server的证书,由API服务器验证kubelet客户端证书等。
证书生成操作可以在master节点上执行,证书只需要创建一次,以后在向集群中添加新节点时只要将证书拷贝到新节点上,并做一定的配置即可。我们计划在k8s-master2,k8s-master3及k8s-node1上部署etcd,下面就在 k8s-master2节点上来创建证书。
<1> k8s证书
如下是k8s各个组件需要使用的证书:
<2> cfssl工具下载
我们通过cfssl工具来生成证书,通过以下链接下载arm平台的cfssl,目前只有arm32的工具,但是也可以用在arm64平台上。
3.2自签Etcd SSL证书
首先为etcd签发一套SSL证书,通过如下命令创建几个目录,/k8s/etcd/ssl 用于存放etcd自签证书,/k8s/etcd/cfg用于存放etcd配置文件,/k8s/etcd/bin用于存放 etcd执行程序。
<1> 创建CA配置文件:ca-config.json
执行如下命令创建ca-config.json
# cat > ca-config.json <<EOF
说明:
signing:表示该证书可用于签名其它证书;生成的ca.pem证书中CA=TRUE;
profiles:可以定义多个profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个profile;
expiry:证书过期时间;
server auth:表示client可以用该CA对server提供的证书进行验证;
client auth:表示server可以用该CA对client提供的证书进行验证。
<2> 创建CA证书签名请求文件:ca-csr.json
执行如下命令创建ca-csr.json:
# cat > ca-csr.json <<EOF
说明:
CN:Common Name,kube-apiserver从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
key:加密算法;
C:国家;
ST:地区;
L:城市;
O:组织,kube-apiserver从证书中提取该字段作为请求用户所属的组 (Group);
OU:组织单位。
<3> 生成CA证书和私钥
说明:
ca-key.pem:CA私钥;
ca.pem:CA数字证书。
<4> 创建证书签名请求文件:etcd-csr.json
执行如下命令创建 etcd-csr.json:
说明:
hosts:需要指定授权使用该证书的IP或域名列表,这里配置所有etcd的IP地址;
key:加密算法及长度。
<5> 为etcd生成证书和私钥
说明:
-ca:指定CA数字证书;
-ca-key:指定CA私钥;
-config:CA配置文件;
-profile:指定环境;
-hostname:指定证书所属的hostname或IP;
-bare:指定证书名前缀。
说明:
etcd-key.pem:etcd私钥;
etcd.pem:etcd数字证书。
证书生成完成,后面部署Etcd时主要会用到如下几个证书:
3.3Etcd数据库集群部署
etcd集群采用一主多从架构模式部署,集群通过选举产生leader,因此需要部署奇数个节点(3/5/7)才能正常工作;etcd使用raft一致性算法保证每个节点的一致性。
<1> 下载etcd
从 github上下载合适版本的 etcd
<2> 创建 etcd 配置文件:etcd.conf
说明:
ETCD_NAME:etcd在集群中的唯一名称
ETCD_DATA_DIR:etcd数据存放目录
ETCD_LISTEN_PEER_URLS:etcd集群间通讯的地址,设置为本机IP
ETCD_LISTEN_CLIENT_URLS:客户端访问的地址,设置为本机IP
ETCD_INITIAL_ADVERTISE_PEER_URLS:集群内部通讯地址,设置为本机IP
ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址,设置为本机IP
ETCD_INITIAL_CLUSTER:集群节点地址,以 key=value 的形式添加各个 etcd 的地址
ETCD_INITIAL_CLUSTER_TOKEN:集群令牌,用于集群间做简单的认证
ETCD_INITIAL_CLUSTER_STATE:集群状态
ETCD_CERT_FILE:客户端 etcd 数字证书路径
ETCD_KEY_FILE:客户端 etcd 私钥路径
ETCD_TRUSTED_CA_FILE:客户端 CA 证书路径
ETCD_PEER_CERT_FILE:集群间通讯etcd数字证书路径
ETCD_PEER_KEY_FILE:集群间通讯etcd私钥路径
ETCD_PEER_TRUSTED_CA_FILE:集群间通讯CA证书路径
<3> 创建etcd服务:etcd.service
通过EnvironmentFile指定etcd.conf作为环境配置文件
etcd可以通过命令行选项和环境变量配置启动;命令行参数选项与环境变量命名的关系是命令行选项的小写字母转换成环境变量的大写字母时加一个“ETCD_”前缀,如:--name对应ETCD_NAME。
(注意:如果配置文件etcd.conf中已经定义了参数变量,则在etcd.service文件中ExecStart行不要再添加相同的启动参数,否则服务拉起的时候etcd会报参数冲突错误)
<4> 将etcd目录拷贝到另外两个节点
修改k8s-master3节点的/k8s/etcd/cfg/etcd.conf:
修改k8s-node1节点的 /k8s/etcd/cfg/etcd.conf:
<5> 启动 etcd 服务
首先在三个节点将etcd.service 拷贝到/usr/lib/systemd/system/下
在三个节点同时启动 etcd 服务
设置开机启动
查看 etcd 集群状态
04部署Master组件
4.1自ApiServer SSL证书
k8s集群中所有资源的访问和变更都是通过kube-apiserver的REST API来实现的,首先在k8s-master2节点上部署kube-apiserver组件。
我们首先为apiserver签发一套SSL证书,过程与etcd自签SSL证书类似。通过如下命令创建几个目录,ssl用于存放自签证书,cfg用于存放配置文件,bin用于存放执行程序,logs存放日志文件。
<1> 创建 CA 配置文件:ca-config.json
执行如下命令创建 ca-config.json
<2> 创建 CA 证书签名请求文件:ca-csr.json
<3> 生成 CA 证书和私钥
<4> 创建证书签名请求文件:kubernetes-csr.json
执行如下命令创建 kubernetes-csr.json:
说明:
hosts:指定会直接访问apiserver的IP列表,一般需指定etcd集群、kubernetes master集群的主机IP和kubernetes服务的服务IP,Node的IP一般不需要加入。
<5> 为kubernetes生成证书和私钥
4.2部署 kube-apiserver 组件
<1> 下载二进制包
解压后先将k8s-master2节点上部署的组件拷贝到/k8s/kubernetes/bin目录下:
<2> 创建Node令牌文件:token.csv
Master apiserver启用TLS认证后,Node节点kubelet组件想要加入集群,必须使用CA签发的有效证书才能与apiserver通信,当Node节点很多时,签署证书是一件很繁琐的事情,因此有了 TLS Bootstrap 机制,kubelet会以一个低权限用户自动向 apiserver申请证书,kubelet的证书由apiserver动态签署。因此先为apiserver生成一个令牌文件,令牌之后会在Node中用到。
生成token,一个随机字符串,可使用如下命令生成token,apiserver配置的token必须与Node节点bootstrap.kubeconfig配置保持一致。
创建 token.csv,格式:token,用户,UID,用户组
<3> 创建kube-apiserver配置文件:kube-apiserver.conf
kube-apiserver有很多配置项,可以参考官方文档查看每个配置项的用途:
(注意:“\” 后面不要有空格,不要有多余的换行,否则启动失败)
重点配置说明:
--etcd-servers:etcd 集群地址
--bind-address:apiserver 监听的地址,一般配主机IP
--secure-port:监听的端口
--advertise-address:集群通告地址,其它Node节点通过这个地址连接 apiserver,不配置则使用bind-address
--service-cluster-ip-range:Service 的 虚拟IP范围,以CIDR格式标识,该IP范围不能与物理机的真实IP段有重合。
--service-node-port-range:Service 可映射的物理机端口范围,默认30000-32767
--admission-control:集群的准入控制设置,各控制模块以插件的形式依次生效,启用RBAC授权和节点自管理。
--authorization-mode:授权模式,包括:AlwaysAllow,AlwaysDeny,ABAC(基于属性的访问控制),Webhook,RBAC(基于角色的访问控制),Node(专门授权由 kubelet 发出的API请求)。(默认值"AlwaysAllow")。
--enable-bootstrap-token-auth:启用TLS bootstrap功能
--token-auth-file:这个文件将被用于通过令牌认证来保护API服务的安全端口。
--v:指定日志级别,0~8,越大日志越详细
<4> 创建apiserver服务:kube-apiserver.service
<5> 启动kube-apiserver组件
<6> 将kubelet-bootstrap用户绑定到系统集群角色,之后便于Node使用token请求证书:
4.3部署kube-controller-manager组件
<1> 创建kube-controller-manager配置文件:kube-controller-manager.conf
重点配置说明:
--leader-elect:当该组件启动多个时,自动选举,默认true
--master:连接本地apiserver,apiserver 默认会监听本地8080端口
--allocate-node-cidrs:是否分配和设置Pod的CDIR
--service-cluster-ip-range:Service 集群IP段
<2> 创建kube-controller-manager服务:kube-controller-manager.service
<3> 启动kube-controller-manager组件
4.4部署kube-scheduler组件
<1> 创建kube-scheduler配置文件:kube-scheduler.conf
<2> 创建 kube-scheduler服务:kube-scheduler.service
<3> 启动kube-scheduler组件
4.5查看集群状态
<1> 查看组件状态
未完待续
如何在openEuler树莓派镜像上部署k8s+iSula集群(下篇)
文章转载自公众号:openEuler
