master :
api-server:统一的调度、协调的组件、唯一与etcd、kubelet对接的组件,也是统一的client客户端对接的入口
scheduler:调度中心,用于按照定义的规则调度Pod资源到指定的node
controller Manager:控制器管理中心,用于管理、调用各种控制器资源node
ETCD:K8S的数据库节点,版本时V3.X主要用于存储K8S内部的所有资源,只和api-server交互
node:
kubelet:
-统一管理自身的node节点具体任务的执行
-做为Master管理node节点的一个代理,代理的用户身份一般是bootstrap
-统计kubelet所在节点的信息、事件,并汇总给master的api-server再保存到etcd中
kube-proxy:做为node节点的L4层代理、主要为services 提供负载均衡、映射功能(通过iptables、 ipvs方式)
client:
kubectl:
-K8S集群(客户端)命令行工具,用于管理K8集群的资源
-kubectl在对yaml文件进行管理操作时,会先检测yaml文件语法,格式,然后转化为json格式,然后与api-server进行交互(接口交互)传递指令
master管理worker node
ETCD 一般来说ETCD如果用于单master节点,ETcd只有一个,用的基础版本是3,因为有listwatch机制
多节点的K8S集群,假设master+worker node 一共20台以内,ETCD中的数据为2G
客户端管理工具,kubectl(命令行的基操)可以对yml文件进行转换成json并且对yml文件的语法进行检查
K8S安全性要求很高,所以,会对所有使用kubectl命令行的用户本身以及权限范围进行认证(组件:AUTH)
K8S -master节点的核心组件 api-server(组件,一组代码集,通过restful api等api接口来接收来自客户端的指令信息,特点:如果来源是kubectl,那么常用的识别格式是json)
K8S-master-api-server将kubectl请求的工作记录,写入etcd,然后调用controller manager控制器管理中心中的主控制器:例如deployment,然后,再调用scheuler来执行预选优选(在此之前会再次和etcd交互,获取worker node节点的资源状态)
调度器,再通过api-server连接node01中的kubelet代理,再由kubelet执行具体的操作
kebectl核心组件
对接master的api-server(master和worker node的唯一对接途径)
管理kubectl组件所在的节点资源信息,以及执行具体的操作
收集kubelet所在的worker node节点的各种资源状态、资源使用成度、以及故障反馈等等信息,然后定期反馈给master的api-server。api-server再记录到ETCD中
kube-proxy
container(docker)
client:自己开发的UI界面(web界面)或者一体化平台rancher、kubespere、ACK、CCE
API接口调用方式
kubectl原生(用户态、命令行、终端)控制集群的工具
最终的目的:控制、管理K8S集群
资源信息和集群信息实在控制台监测,而kubectl是做一些基本的查询和排障
部署方式:
web、ui部署:rancher、kubesphere、ACK、CCE
二进制kubeadm
其他工具类(偏于自动化):shell、ansible
CA证书中包含密钥对
CA证书可以对通信加密,同时标识身份的唯一性
.pem :证书
1、服务器单向认证:只需要服务器端捉供证书,客户端通过服务器端证书验证服务的身份,但服务器并不验证客户端的身份。这种情况一般适用于对Internet开放的服务,例如搜索引擎网站,任何客户端都可以连接到服务器上进行访问,但客户端需要验证服务器的身份,以避免连接到伪造的恶意服务器。
2双向 "TLs 认证:除了客户端需婴验证服务器的证书,服务器也要通过客户端证书验证客户端的身份。这种情况下服务器提供的是敏感信息,只允许特定身份的客户端访问。在Kubernetes中,各个组什提供的接口中包含了类群的内部信息。如果这些接口被非法访问,将影响类群的安全,因此组件之间的通信需要采用双向rL.s认证。即客户端和服务器端都需要验证对方的身份信息。在两个组件进行双向认证时,会涉及到下面这些证书相关的文件:
服务器端证书:服务器用于证明自身身份的数字证书,里面主要包含了服务器端的公钥以及服务器的身份信息。服务器端私钥:服务器端证书中包含的公钥所对应的私钥。公钥和私钥是成对使用的,在进行TLs验证时,服务器使用该私钥来向客户端证明自己是服务器端证书的拥有者
客户端证书:客户端用于证明自身身份的数字证书,里面主要包含了客户端的公钥以及客户端的身份信息。
客户端私钥:客户端证书中包含的公钥所对应的私钥,同理,客户端使用该私钥来向服务器端证明自己是客户端证书的拥有者。
服务器端cA根证书:签发服务器端证书的cA 根证书,客户端使用该cA根证书来验证服务器端证书的合法性。
客户端端cA根证书:签发客户端证书的 cA 根证书,服务器端使用该cA根证书来验证客户端证书的合法性。
1、制作官方颁发的证书: K8S集群的CA证书
创建ca密钥(文件定义)ca-key.pem、
创建ca证书(文件定义)ca.pem
2、制作master端的证书(用于内部加密通讯,同时为了给与Client端颁发master签名的证书)创建过程:需要以下几部
设置私钥确保安全加密.pem
私钥签名确保身份真实.csr
制作证书(需要cA官方颁发)cert.pem
创建私钥
私钥签名
使用ca证书与密钥证书签名
1、先部署etcd(需要单独申请CA证书)
2、部署master组件、部署node组件(需要单独申请CA证书)
3、部署网络插件CNI
4、将node节点添加入master的K8S集群
5、运行测试kubectl get nodes --》status ready
K8S 中master和node内部和相互之间的通讯都需要CA证书的加密包括ETCD集群之间的通讯需要CA进行加密
K8S :1.15以下,组件之间交互使用CA,但是节点之间交互使用http 8080
1.15以上均需要CA加密才可通讯
1.15老项目,1.17-1.18过渡版本 1.20新项目和老项目更新
三、部署ETCD
[root@localhost ~]# mkdir k8s && cd k8s
[root@localhost k8s]# cat etcd-cert.sh
cat > ca-config.json < ca-csr.json <
制作证书
[root@localhost k8s]# vim ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
[root@localhost k8s]# vim ca-csr.json
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
[root@localhost k8s]# cd /usr/local/bin
[root@localhost bin]# chmod +x * 给与执行权限
[root@localhost ~]# cd k8s/
[root@localhost k8s]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
[root@localhost k8s]# vim server-csr.json
{
"CN": "etcd",
"hosts": [
"192.168.133.50",
"192.168.133.75",
"192.168.133.100"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
[root@localhost k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
小结:
首先,必须先向cA机构申请证书,并且说明申请证书的用途((ca-config.json —》www模块)
制作cA官方的证书文件,包含ca-Key.pem密钥文件+ ca.pem 证书文件——》官方的
再根据官方认证的CA.PEM +CA-KEY.PEM来制作server端的证书