使用二进制方式搭建k8s集群
安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统CentOS7.x-86_64(个人选择CentOS7.9)
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘50GB或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
- 禁止swap分区
准备环境
名称 | IP | 组件 |
---|---|---|
k8s-m1 | 192.168.100.104 | kube-apiserver, kube-controller-manager, kube-scheduler, etcd |
k8s-n1 | 192.168.100.105 | kubelet, kube-proxy, docker etcd |
操作系统初始化配置
所有机器执行
部署etcd集群
节点名称 | IP |
---|---|
etcd-1 | 192.168.100.104 |
etcd-2 | 192.168.100.105 |
为了节省机器,这里与k8s节点机器复用,也可以独立于k8s集群之外部署,只要apiserver能连接就行。
准备cfssl证书生成工具
cfssl是一个开源的证书管理工具,使用json文件生成证书,相比openssl更方便使用。
找任意一台服务器操作,这里用k8s-m1节点。
生成etcd证书
自签证书颁发机构(CA)
创建工作目录:
自签CA:
生成证书:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
使用自签CA签发etcd HTTPS证书
创建证书申请文件:
上述文件hosts字段中IP为所有etcd及诶单的集群内部通信IP,一个都不能少!为了方便后期扩容可以多些几个预留的IP
生成证书:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
下载二进制文件及部署etcd集群
下载二进制文件
部署etcd集群
以下在节点1(k8s-m1)上操作,为简化操作,待会儿将节点1生成的所有文件拷贝到节点2(k8s-n1)
创建工作目录并解压二进制包
创建etcd配置文件
systemd管理etcd
拷贝刚才生成的证书
把刚才生成的证书拷贝到配置文件中的路径:
cp ~/TLS/etcd/ca*pem ~/TLS/etcd/server*pem /opt/etcd/ssl/
将上面节点1所有的生成文件拷贝到节点2
然后在k8s-n1
修改etcd.conf
配置文件中的节点名称和当前服务器IP:
分别在2个节点上操作,启动并设置开机启动
查看集群状态
/opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.100.104:2379,https://192.168.100.105:2379" endpoint health --write-out=table
安装Docker
以下在所有节点操作,这里采用二进制安装,用yum安装也一样。
解压二进制包
systemd管理docker
创建配置文件
启动并设置开机启动
部署Master Node
生成kube-apiserver证书
自签证书颁发机构(CA)
生成证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
使用自签CA签发kube-apiserver HTTPS证书
创建证书申请文件:
上述文件hosts字段中IP为所有Master/LB/VIP IP,一个都不能少!为了方便后期扩容可以多写几个预留的IP
生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
下载二进制文件,解压二进制包
部署kube-apiserver
创建配置文件
上面两个\ \ 第一个是转义符,第二个是换行符,使用转义符是为了使用EOF保留换行符。
–logtostderr:启用日志
—v:日志等级
–log-dir:日志目录
–etcd-servers:etcd集群地址
–bind-address:监听地址
–secure-port:https安全端口
–advertise-address:集群通告地址
–allow-privileged:启用授权
–service-cluster-ip-range:Service虚拟IP地址段
–enable-admission-plugins:准入控制模块
–authorization-mode:认证授权,启用RBAC授权和节点自管理
–enable-bootstrap-token-auth:启用TLS bootstrap机制
–token-auth-file:bootstrap token文件
–service-node-port-range:Service nodeport类型默认分配端口范围
–kubelet-client-xxx:apiserver访问kubelet客户端证书
–tls-xxx-file:apiserver https证书
–etcd-xxxfile:连接Etcd集群证书
–audit-log-xxx:审计日志
拷贝刚才生成的证书
把刚才生成的证书拷贝到配置文件中的路径:
cp ~/TLS/k8s/ca*pem ~/TLS/k8s/server*pem /opt/kubernetes/ssl/
启用 TLS Bootstrapping 机制
TLS Bootstraping:Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。为了简化流程,Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。所以强烈建议在Node上使用这种方式,目前主要用于kubelet,kube-proxy还是由我们统一颁发一个证书。
创建配置文件中token文件:
echo $(head -c 16 /dev/urandom | od -An -t x | tr -d ' '),kubelet-bootstrap,10001,"system:kubelet-bootstrap" > /opt/kubernetes/cfg/token.csv
systemd管理apiserver
启动并设置开机启动
授权kubelet-bootstrap用户允许请求证书
部署kube-controller-manager
创建配置文件
–master:通过本地非安全本地端口8080连接apiserver。
–leader-elect:当该组件启动多个时,自动选举(HA)
cluster-signing-cert-file/–cluster-signing-key-file:自动为kubelet颁发证书的CA,与apiserver保持一致
systemd管理controller-manager
启动并设置开机启动
部署kube-scheduler
创建配置文件
–master:通过本地非安全本地端口8080连接apiserver。
–leader-elect:当该组件启动多个时,自动选举(HA)
systemd管理scheduler
启动并设置开机启动
部署kubectl
生成kubectl连接集群的证书
生产证书
生成kubeconfig文件
查看当前集群组件状态
kubectl get cs
部署Worker Node
说明:下面还是在Master Node上操作,即同时作为Worker Node
创建工作目录并拷贝二进制文件
在所有worker node创建工作目录
部署kubelet
创建配置文件
–hostname-override:显示名称,集群中唯一
–network-plugin:启用CNI
–kubeconfig:空路径,会自动生成,后面用于连接apiserver
–bootstrap-kubeconfig:首次启动向apiserver申请证书
–config:配置参数文件
–cert-dir:kubelet证书生成目录
–pod-infra-container-image:管理Pod网络容器的镜像
配置参数文件
生成bootstrap.kubeconfig文件
拷贝到配置文件路径:cp bootstrap.kubeconfig /opt/kubernetes/cfg
systemd管理kubelet
启动并设置开机启动
批准kubelet证书申请并加入集群
查看kubelet证书请求
kubectl get csr
批准申请
kubectl certificate approve node-csr-xxxxxxx
查看节点
由于网络插件还没有部署,节点会没有准备就绪 NotReady
部署kube-proxy
创建配置文件
配置参数文件
生成kube-proxy.kubeconfig文件
生成kube-proxy证书
生成kubeconfig文件
拷贝到配置文件指定路径:cp kube-proxy.kubeconfig /opt/kubernetes/cfg/
systemd管理kube-proxy
启动并设置开机启动
部署CNI网络
下载CNI二进制文件,解压二进制包并移动到默认工作目录:
部署CNI网络,创建flannel网络插件
授权apiserver访问kubelet
新增加Worker Node
拷贝已部署好的Node相关文件到新节点
如:在master节点将Worker Node涉及文件拷贝到新节点192.168.100.105(k8s-n1)
删除kubelet证书和kubeconfig文件(在k8s-n1上执行)
这几个文件是证书申请审批后自动生成的,每个Node不同,必须删除重新生成。