针不戳----Kubernetes单master节点二进制部署
文章目录
前言
一、单节点架构
二、组件介绍
三、具体部署
3.1:部署 Etcd 集群
3.2:node 节点安装 docker 组件
3.3:flannel 网络配置
3.4:部署 master 组件
3.5:部署 node 组件
3.6:查看集群状态
前言
Kubernetes 的主要服务程序都可以通过直接运行而今只能怪文件加上启动参数完成运行。在 Kubernetes 的 Master 上需要部署 etcd、kube-apiserver、kube-controller-manager、kube-scheduler 服务进行,在工作 Node 上需要部署 docker 、kubelet 和 kube-proxy 服务进程。
将 Kubernetes 的二进制可执行文件复制到/usr/bin目录下,然后在/usr/lib/systemd/system目录下为各服务创建 systemd 的服务配置文件,这样就完成了软件的安装。要使 Kubernetes 正常工作,需要详细配置各个服务的启动参数。
一、单节点架构
- 单节点架构图
二、组件介绍
-
master节点
- kubei-schduler:很久调度算法为新建的Pod选择一个 Node 节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同节点上
- etcd:分布式键值存储系统,用于保存集群状态数据,比如 Pod、Service 等对象信息。
- Kube-apiserver:Kubernetes API,集群的统一入口,各组件协调者,以 RESTful API 提供接口服务,所有对象资源的增删改查和监听操作都交给 APIServer 处理后再提交给Etcd存储。
- kube-controller-manager:处理集中群常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。
-
Node组件
- kubelet:kubelet 是 Master 在 Node 节点上的 Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载 secret、获取容器和接电状态等工作。kubelet将每个Pod转换为一组容器。
- kube-proxy:在 Node 节点上实现 Pod 网络代理,维护网络规划和四层负载均衡工作。
- docker或者rocket:容器引擎,运行容器
-
关于Etcd集群
- Etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)仓库,遵循Apache v2许可,基于Go语言实现。
接触过分布式系统我们应该知道,分布式系统中最基本的问题之一就是实现信息的共识,在此基础上才能实现对服务配置信息的管理、服务的发现、更新、同步,等等。而要解决这些问题,往往需要利用一套能保证一致性的分布式数据库系统。比如经典的Apache ZooKeeper项目,采用了Paxos算法来实现数据库的强一致性。
Etcd专门为集群环境设计,采用了更为简洁的Raft共识算法 ,同样可以实现数据强一致性,并支持集群节点状态管理和服务自动发现。
Etcd目前在github.com/coreos/etcd进行维护,最新版本为3.x系列。
受到Apache ZooKeeper项目和doozer项目(doozer是一个一致性分布式数据库实现,主要面向少量数据)的启发,Etcd在设计的时候重点考略了下面四个因素:
- 简单:支持RESTful API和gRPC API;
- **安全:**基于TLS方式实现安全连接访问;
- **快速:**支持每秒一万次的并发写操作,超时控制在毫秒两集;
- **可靠:**支持分布式结构,基于Raft算法实现一致性。
通常情况下,用户使用Etcd可以在多个节点上启动多个实例,并将它们添加为一个集群。同一个集群中的Etcd实例将会自动保持彼此信息的一致性,这意味着分布在各个节点上的应用也将获取到一致的信息。
-
关于CA认证
-
在一个安全的的内网环境中,Kubernetes 的各个组件与 Master 之间可以通过kube-apiserver 非安全端口 http://<kube-apiserver-ip>:8080 进行 访问。但如果 API Server 需要对外提供服务,或者集群中的某些容器也需要访问 API Server 以获取集群中的某些信息,则更安全的做法是启用 HTTPS 安全机制。Kubernetes 提供了基于 CA 签名的双向数字证书认证凡是和简单的基于 HTTPS Base 或者Token 的认证方式,其中 CA 证书方式的安全性最高。这边我们实验中以 CA 证书的方式配置 Kubernetes 集群,要求 Master 上的kube-apiserver、kube-controller-manager、kube-scheduler 进程及各 Node 节点上的 kubelet、kube-proxy进程进行 CA 签名双向数字证书安全设置。 基于 CA 签名的双向数字证书的生成过程如下:
- 为 kube-apiserver 生成一个数字证书,并用 CA 证书签名。
- 为 kube-apiserver 进程配置证书相关的启动参数,包括 CA 证书 (用于验证客户端证书的签名真伪)、自己经过 CA 签名后的证书及私钥。
- 为每个访问 Kubernetes API Server 的客户端(如 kube-controller-manager、kube-scheduler、kubelet、kube-proxy 及调用 API Server 的客户端程序 kubelet 等)进程都生成自己的证书,也都用 CA 证书签名,在相关程序的启动参数里增加 CA 证书、自己的证书等相关参数。
- 各节点用到的证书
组件 证书 etcd ca.pem,server.pem,server-key.pem flannel ca.pem,server.pem,server-key.pem kube-apiserver ca.pem,server.pem,server-key.pem kubelet ca.pem,ca-key.pem kube-proxy ca.pem,kube-proxy.pem,kube-proxy-key.pem kubectl ca.pem,admin-pem,admin-key.pem
-
三、具体部署
- 实验环境
节点 | IP地址 | 硬件资源 | 组件 |
---|---|---|---|
master | 192.168.100.10 | CentOS7.4 (双核双线 4G) | kube-apiserver、kube-controller-manager、kube-scheduler、etcd |
node1 | 192.168.100.20 | CentOS7.4 (双核双线 4G) | kubelet、kube-proxy、docker、flnanel、etcd |
node2 | 192.168.100.30 | CentOS7.4 (双核双线 4G) | kubelet、kube-proxy、docker、flannel、etcd |
- 下载 etcd 组件 Releases · etcd-io/etcd · GitHub
- 下载 Kubernetes 组件 Releases · etcd-io/etcd · GitHub
3.1:部署 Etcd 集群
-
部署 master 节点
- 编辑etcd服务集群开启的脚本(一键部署脚本)
[root@master ~]# mkdir k8s [root@master ~]# cd k8s/ [root@master k8s]# vim etcd.sh #!/bin/bash # example: ./etcd.sh etcd01 192.168.1.10 etcd02=https://192.168.1.11:2380,etcd03=https://192.168.1.12:2380 ####位置变量指定节点名字,IP地址,和集群 ETCD_NAME=$1 ETCD_IP=$2 ETCD_CLUSTER=$3 WORK_DIR=/opt/etcd ####创建etcd的配置文件 cat <<EOF >$WORK_DIR/cfg/etcd #[Member] ETCD_NAME="${ETCD_NAME}" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380" ####etcd内部端口 ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379" ####etcd对外提供的端口 #[Clustering],定义集群信息 ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380" ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379" ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" EOF ##生成服务执行脚本 cat <<EOF >/usr/lib/systemd/system/etcd.service [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target ##定义服务之间的证书认证 [Service] Type=notify EnvironmentFile=${WORK_DIR}/cfg/etcd ExecStart=${WORK_DIR}/bin/etcd \ --name=\${ETCD_NAME} \ --data-dir=\${ETCD_DATA_DIR} \ --listen-peer-urls=\${ETCD_LISTEN_PEER_URLS} \ --listen-client-urls=\${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \ --advertise-client-urls=\${ETCD_ADVERTISE_CLIENT_URLS} \ --initial-advertise-peer-urls=\${ETCD_INITIAL_ADVERTISE_PEER_URLS} \ --initial-cluster=\${ETCD_INITIAL_CLUSTER} \ --initial-cluster-token=\${ETCD_INITIAL_CLUSTER_TOKEN} \ --initial-cluster-state=new \ --cert-file=${WORK_DIR}/ssl/server.pem \ --key-file=${WORK_DIR}/ssl/server-key.pem \ --peer-cert-file=${WORK_DIR}/ssl/server.pem \ --peer-key-file=${WORK_DIR}/ssl/server-key.pem \ --trusted-ca-file=${WORK_DIR}/ssl/ca.pem \ --peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF ##开启服务 systemctl daemon-reload systemctl enable etcd systemctl restart etcd
- 编辑证书、签名、密钥的脚本(一键部署脚本)
[root@master k8s]# vim etcd-cert.sh ####定义ca证书 cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF ####实现证书签名 cat > ca-csr.json <<EOF { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing" } ] } EOF ####生产证书,生成ca-key.pem ca.pem cfssl gencert -initca ca-csr.json | cfssljson -bare ca - ####指定etcd三个节点之间的通信验证 cat > server-csr.json <<EOF { "CN": "etcd", "hosts": [ "192.168.100.10", "192.168.100.20", "192.168.100.30" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing" } ] } EOF ####生成ETCD证书 server-key.pem server.pem cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
- 下载cfssl证书生成工具
[root@master k8s]# vim cfssl.sh curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo [root@master k8s]# ll /usr/local/bin/ 总用量 18808 -rwxr-xr-x 1 root root 10376657 1月 16 2020 cfssl -rwxr-xr-x 1 root root 6595195 1月 16 2020 cfssl-certinfo -rwxr-xr-x 1 root root 2277873 1月 16 2020 cfssljson
- 执行脚本生成证书,并将证书移动到目录下的etcd-cert目录下便于管理
[root@master k8s]# ./etcd-cert.sh 2020/11/24 19:44:30 [INFO] generating a new CA key and certificate from CSR 2020/11/24 19:44:30 [INFO] generate received request 2020/11/24 19:44:30 [INFO] received CSR 2020/11/24 19:44:30 [INFO] generating key: rsa-2048 2020/11/24 19:44:30 [INFO] encoded CSR 2020/11/24 19:44:30 [INFO] signed certificate with serial number 179234423085770384325949193674187086340408540536 2020/11/24 19:44:30 [INFO] generate received request 2020/11/24 19:44:30 [INFO] received CSR 2020/11/24 19:44:30 [INFO] generating key: rsa-2048 2020/11/24 19:44:30 [INFO] encoded CSR 2020/11/24 19:44:30 [INFO] signed certificate with serial number 556