自签证书
k8s集群由两套证书:1、etcd集群内部通信的证书;2、访问apiserver需要的证书
etcd推荐使用cfssl工具来生成证书进行验证
https://my.oschina.net/u/4342638/blog/3608300
etcd集群master节点安装 1,自签名SSL证书 ##安装工具cfssl $ cat 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-certinfochmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo
##自签名证书脚本详解 root@k8s-master: ~/k8s/etcd-cert 16:56:21 $ cat etcd-cert.sh #ca办法证书机构 cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" #证书过期时间h单位 }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF #ca机构请求
cat > ca-csr.json <<EOF { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing" } ] } EOF #生成证书:读取上边两个文件生成证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- #etcd域名证书,需要把etcd节点ip都写进去,多写点备份用 cat > server-csr.json <<EOF { "CN": "etcd", "hosts": [ "192.168.1.63", "192.168.1.65", "192.168.1.66" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing" } ] } EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
上面这四个证书需要使用到
https://blog.frognew.com/2017/04/install-etcd-cluster.html
TLS密钥和证书
这里部署的etcd集群使用TLS证书对证书通信进行加密,并开启基于CA根证书签名的双向数字证书认证。
下面介绍使用cfssl生成所需要的私钥和证书.
安装cfssl
cfssl是使用Go语言开发的工具,如果系统中安装了Go,可以使用直接go get
安装cfssl:
go get -u github.com/cloudflare/cfssl/cmd/...
会在$GOPATH/bin
下安装cfssl, cfssjosn, mkbundle等工具。
CA证书和私钥
创建ca-config.json:
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"frognew": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
ca-config.json中可以定义多个profile,分别设置不同的expiry和usages等参数。如上面的ca-config.json中定义了名称为frognew的profile,这个profile的expiry 87600h为10年,useages中:
signing
表示此CA证书可以用于签名其他证书,ca.pem中的CA=TRUE
server auth
表示TLS Server Authenticationclient auth
表示TLS Client Authentication
创建CA证书签名请求配置ca-csr.json:
{
"CN": "frognew",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "frognew",
"OU": "cloudnative"
}
]
}
下面使用cfss生成CA证书和私钥:
|
|
|
ca-key.pem和ca.pem需要保存在一个安全的地方,后边会用到。
etcd证书和私钥
创建etcd证书签名请求配置etcd-csr.json:
|
注意上面配置hosts字段中制定授权使用该证书的IP和域名列表,因为现在要生成的证书需要被etcd集群各个节点使用,所以这里指定了各个节点的IP和hostname。
下面生成etcd的证书和私钥:
|
|
对生成的证书可以使用cfssl或openssl查看:
|
|
https://589e.com/category/building-etcd-cluster.html
介绍
- 简单:相比于晦涩难懂的 Paxos 算法,etcd 基于相对简单且易实现的 Raft 算法实现一致性,并通过 gRPC 提供接口调用
- 安全:支持 TLS 通信,并可以针对不同的用户进行对 key 的读写控制
- 高性能:10,000/秒的写性能
一、环境准备
1.1 机器信息
主机名 | IP | 系统 |
---|---|---|
node1 | 172.29.150.202 | Centos 7.2 |
node2 | 172.29.150.203 | Centos 7.2 |
node3 | 172.29.150.204 | Centos 7.2 |
1.2 关闭防火墙及 SELinux
systemctl stop iptables
systemctl stop firewalld
systemctl disable iptables
systemctl disable firewalld
vi /etc/selinux/config
SELINUX=disable
1.3 设置 hosts
vim /etc/hosts
172.29.150.202 node1
172.29.150.203 node2
172.29.150.204 node3
1.4 创建用户
useradd etcd -d /opt/platform/etcd -c "Etcd user" -r -s /sbin/nologin
1.4 创建用户
useradd etcd -d /opt/platform/etcd -c "Etcd user" -r -s /sbin/nologin
二、创建验证
2.1 安装 CFSSL
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
2.2 创建 CA 证书配置,生成 CA 证书和私钥
mkdir /opt/ssl
cd /opt/ssl
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
- ca-config.json:
- 可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
- signing:
- 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
- server auth:
- 表示 Client 可以用该 CA 对 Server 提供的证书进行验证;
- client auth:
- 表示 Server 可以用该 CA 对 Client 提供的证书进行验证;
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Wuhan",
"L": "Hubei",
"O": "k8s",
"OU": "System"
}
]
}
- CN:
- Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名(User Name);浏览器使用该字段验证网站是否合法;
- O:
- Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组(Group);
cd /opt/ssl
cfssl gencert -initca csr.json | cfssljson -bare ca
[root@k8s-console ssl]# tree
├── ca.csr
├── ca-key.pem
├── ca.pem
├── config.json
└── csr.json
2.3 创建 etcd 证书配置,生成 etcd 证书和私钥
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"172.29.150.202",
"172.29.150.203",
"172.29.150.204"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Shanghai",
"L": "Shanghai",
"O": "etcd",
"OU": "Etcd Security"
}
]
}
cd /opt/ssl
cfssl gencert -ca=/opt/ssl/ca.pem
-ca-key=/opt/ssl/ca-key.pem
-config=/opt/ssl/config.json
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd
ls etcd*
etcd.csr etcd-csr.json etcd-key.pem etcd.pem
2.4 证书分发
for IP in `seq 202 204`;do
scp scp ca*.pem etcd*.pem root@172.29.150.$IP:/opt/ssl
done
chmod 644 /opt/ssl/*
三、安装 etcd
3.1 在三台上都安装 etcd
tar -xvf etcd-v3.3.4-linux-amd64.tar.gz
cd etcd-v3.3.4-linux-amd64
cp mv etcd* /opt/platform/etcd/
cd ..
rm -rf etcd-v3.3.4-linux-amd64
三、安装 etcd
3.1 在三台上都安装 etcd
tar -xvf etcd-v3.3.4-linux-amd64.tar.gz
cd etcd-v3.3.4-linux-amd64
cp mv etcd* /opt/platform/etcd/
cd ..
rm -rf etcd-v3.3.4-linux-amd64
3.2 添加 etcd 配置
vim /opt/platform/etcd/etcd.conf
# [member]
ETCD_NAME=etcd1
ETCD_DATA_DIR=/opt/platform/etcd/data
ETCD_LISTEN_PEER_URLS=https://0.0.0.0:2380
ETCD_LISTEN_CLIENT_URLS=https://0.0.0.0:2379
# [cluster]
ETCD_ADVERTISE_CLIENT_URLS=https://172.29.150.202:2379
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://172.29.150.202:2380
ETCD_INITIAL_CLUSTER="etcd1=https://172.29.150.202:2380,etcd2=https://172.29.150.203:2380,etcd3=https://172.29.150.204:2380"
ETCD_INITIAL_CLUSTER_STATE=new
ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
# [security]
ETCD_CERT_FILE="/opt/ssl/etcd.pem"
ETCD_KEY_FILE="/opt/ssl/etcd-key.pem"
ETCD_CLIENT_CERT_AUTH="true"
ETCD_TRUSTED_CA_FILE="/opt/ssl/ca.pem"
ETCD_AUTO_TLS="true"
ETCD_PEER_CERT_FILE="/opt/ssl/etcd.pem"
ETCD_PEER_KEY_FILE="/opt/ssl/etcd-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/opt/ssl/ca.pem"
ETCD_PEER_AUTO_TLS="true"
- ETCD_NAME:
- etcd 集群中的节点名,这里可以随意,可区分且不重复就行。
- ETCD_LISTEN_PEER_URLS:
- 监听的用于节点之间通信的 URL,可监听多个,集群内部将通过这些 URL 进行数据交互(如选举、数据同步等)。
- ETCD_LISTEN_CLIENT_URLS:
- 监听的用于客户端通信的 URL,同样可以监听多个。
- ETCD_ADVERTISE_CLIENT_URLS:
- 建议使用的客户端通信 URL,该值用于 etcd 代理或 etcd 成员与 etcd 节点通信。
- ETCD_INITIAL_ADVERTISE_PEER_URLS:
- 建议用于节点之间通信的 URL,节点间将以该值进行通信。
- ETCD_INITIAL_CLUSTER:
- 也就是集群中所有的 initial--advertise-peer-urls 的合集。
- ETCD_INITIAL_CLUSTER_STATE:
- 新建集群的标志。
- ETCD_INITIAL_CLUSTER_TOKEN:
- 节点的 token 值,设置该值后集群将生成唯一 ID,并为每个节点也生成唯一 ID,当使用相同配置文件再启动一个集群时,只要该 token 值不一样,etcd 集群就不会相互影响。
3.3 添加系统服务
-
vim /usr/lib/systemd/system/etcd.service
[Unit] Description=Etcd Service After=network.target [Service] Environment=ETCD_DATA_DIR EnvironmentFile=-/opt/platform/etcd/etcd.conf Type=notify User=etcd WorkingDirectory=/opt/platform/etcd PermissionsStartOnly=true ExecStart=/usr/bin/etcd Restart=on-failure
RestartSec=10 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
3.4 创建 data 目录,然后启动 etcd 服务
mkdir -p /opt/platform/etcd/data && chown etcd:etcd -R /opt/platform/etcd
systemctl enable etcd.service && systemctl start etcd.service
四、验证 etcd 集群状态
-
etcdctl --endpoints=https://172.29.150.202:2379 --cert-file=/opt/ssl/etcd.pem --ca-file=/opt/ssl/ca.pem --key-file=/opt/ssl/etcd-key.pem cluster-health member 35b8f6acff2c4453 is healthy: got healthy result from https://172.29.150.202:2379 member 718a387d5439a839 is healthy: got healthy result from https://172.29.150.203:2379 member 75b9609afd556afb is healthy: got healthy result from https://172.29.150.204:2379 cluster is healthy
etcdctl --endpoints=https://172.29.150.202:2379 --cert-file=/opt/ssl/etcd.pem --ca-file=/opt/ssl/ca.pem --key-file=/opt/ssl/etcd-key.pem member list 35b8f6acff2c4453: name=etcd1 peerURLs=https://172.29.150.202:2380 clientURLs=https://172.29.150.202:2379 isLeader=true 718a387d5439a839: name=etcd2 peerURLs=https://172.29.150.203:2380 clientURLs=https://172.29.150.203:2379 isLeader=false 75b9609afd556afb: name=etcd3 peerURLs=https://172.29.150.204:2380 clientURLs=https://172.29.150.204:2379
环境信息
CentOS 7.3
|
|
ectd集群采用 3 5 7 9奇数
ETCD 是一个高可用的分布式键值数据库,可用于服务发现。ETCD 采用 raft 一致性算法,基于 Go 语言实现。etcd作为一个高可用键值存储系统,天生就是为集群化而设计的。由于Raft算法在做决策时需要多数节点的投票,所以etcd一般部署集群推荐奇数个节点,推荐的数量为3、5或者7个节点构成一个集群。
Etcd 是 CoreOS 基于 Raft 开发的分布式 key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。
kuberntes 系统使用 etcd 存储所有数据,是最重要的组件之一,注意 etcd集群只能有奇数个节点(1,3,5...),本文档使用3个节点做集群。
我们在上面的master1 node1 node2上面的三台机器上面部署etcd集群
https://www.jianshu.com/p/3189dd70a691
etcd下载地址:https://github.com/coreos/etcd/releases
安装之前三台机器需要设置hostname
下载etcd介质之后解压如下
解压之后存在两个文件夹一个etcd文件夹,一个是etcd.service文件夹
接下来修改etcd的配置文件
创建etcd配置文件etcd.conf,此配置文件是定义一些变量,方便etcd.service文件中直接引用、方便后期维护。
配置文件的所有含义都在创建etcd.service配置文件后有详解。
etcd 是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。etcd 的灵感来自于 ZooKeeper 和 Doozer,侧重于:
简单:支持 curl 方式的用户 API (HTTP+JSON)
安全:可选 SSL 客户端证书认证
快速:单实例可达每秒 10000 次写操作
可靠:使用 Raft 实现分布式
ETCD下载
https://github.com/etcd-io/etcd/releases 选择最新版本:etcd-v3.3.13-darwin-amd64.zip上传到服务器
https://blog.frognew.com/2017/04/install-etcd-cluster.html
etcd集群master节点安装 1,自签名SSL证书 ##安装工具cfssl $ cat 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-certinfochmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo ##自签名证书脚本详解 root@k8s-master: ~/k8s/etcd-cert 16:56:21 $ cat etcd-cert.sh #ca办法证书机构 cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" #证书过期时间h单位 }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF #ca机构请求 cat > ca-csr.json <<EOF { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing" } ] } EOF #生成证书:读取上边两个文件生成证书 cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- #etcd域名证书,需要把etcd节点ip都写进去,多写点备份用 cat > server-csr.json <<EOF { "CN": "etcd", "hosts": [ "192.168.1.63", "192.168.1.65", "192.168.1.66" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
APIserver是整个集群的入口,只有它启动了,别的组件才可以启动;我们基于https访问,所以需要自签证书;
1、创建CA配置json文件
[root@k8s-master01 k8s]# cat ca-csr.json { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "HuBei", "ST": "WuHan", "O": "k8s", "OU": "System" } ] } [root@k8s-master01 k8s]# cat ca-config.json { "signing": { "default": { "expiry": "876000h" }, "profiles": { "kubernetes": { "expiry": "876000h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } }
2、创建apiserver证书的所需配置文件
[root@k8s-master01 k8s]# cat kube-proxy-csr.json
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "HuBei",
"ST": "WuHan",
"O": "k8s",
"OU": "System"
}
]
}
[root@k8s-master01 k8s]# cat server-csr.json
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local",
"10.16.8.150",
"10.16.8.151",
"10.16.8.156",
"10.16.8.155",
"10.16.8.164"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "HuBei",
"ST": "WuHan",
"O": "k8s",
"OU": "System"
}
]
}
注:host中的最后几个IP为需要连接apiserver的IP,一般为master集群的所有IP,和负载均衡LB的所有IP和VIP,本文中的IP
"10.16.8.150", master01
"10.16.8.151", master02
"10.16.8.156", LB
"10.16.8.155", 备用IP
"10.16.8.164" 备用IP
复制代码
3、自建CA
[root@k8s-master01 k8s]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
4、生成证书
[root@k8s-master01 k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server 2019/11/04 16:59:08 [INFO] generate received request 2019/11/04 16:59:08 [INFO] received CSR 2019/11/04 16:59:08 [INFO] generating key: rsa-2048 2019/11/04 16:59:09 [INFO] encoded CSR 2019/11/04 16:59:09 [INFO] signed certificate with serial number 710468047565346200192196031945671979263159074343 2019/11/04 16:59:09 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 ("Information Requirements"). [root@k8s-master01 k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy 2019/11/04 16:59:23 [INFO] generate received request 2019/11/04 16:59:23 [INFO] received CSR 2019/11/04 16:59:23 [INFO] generating key: rsa-2048 2019/11/04 16:59:23 [INFO] encoded CSR 2019/11/04 16:59:23 [INFO] signed certificate with serial number 632011921807538541174903390077695048984832013926 2019/11/04 16:59:23 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for websites. For more information see the Baseline Requirements for the Issuance and Management of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org); specifically, section 10.2.3 ("Information Requirements").
注:host中的最后几个IP为需要连接apiserver的IP,一般为master集群的所有IP,和负载均衡LB的所有IP和VIP,本文中的IP
kube-APIserver组件介绍
kube-APIserver提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。
kube-APIserver的功能
提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更)
提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)
是资源配额控制的入口
拥有完备的集群安全机制
kube-apiserver工作原理图
kubernetes API的访问
k8s通过kube-apiserver这个进程提供服务,该进程运行在单个k8s-master节点上。默认有两个端口
本地端口
该端口用于接收HTTP请求
该端口默认值为8080,可以通过API Server的启动参数“--insecure-port”的值来修改默认值
默认的IP地址为“localhost”,可以通过启动参数“--insecure-bind-address”的值来修改该IP地址
非认证或授权的HTTP请求通过该端口访问API Server
安全端口
该端口默认值为6443,可通过启动参数“--secure-port”的值来修改默认值
默认IP地址为非本地(Non-Localhost)网络端口,通过启动参数“--bind-address”设置该值
该端口用于接收HTTPS请求
用于基于Tocken文件或客户端证书及HTTP Base的认证
用于基于策略的授权
默认不启动HTTPS安全访问控制
kube-controller-manager组件介绍
kube-Controller Manager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
kube-scheduler组件介绍
kube-scheduler是以插件形式存在的组件,正因为以插件形式存在,所以其具有可扩展可定制的特性。kube-scheduler相当于整个集群的调度决策者,其通过预选和优选两个过程决定容器的最佳调度位置。
kube-scheduler(调度器)的指责主要是为新创建的pod在集群中寻找最合适的node,并将pod调度到Node上
从集群所有节点中,根据调度算法挑选出所有可以运行该pod的节点
再根据调度算法从上述node节点选择最优节点作为最终结果
Scheduler调度器运行在master节点,它的核心功能是监听apiserver来获取PodSpec.NodeName为空的pod,然后为pod创建一个binding指示pod应该调度到哪个节点上,调度结果写入apiserver
kube-scheduler主要职责
集群高可用:如果 kube-scheduler 设置了 leader-elect 选举启动参数,那么会通过 etcd 进行节点选主( kube-scheduler 和 kube-controller-manager 都使用了一主多从的高可用方案)
调度资源监听:通过 list-Watch 机制监听 kube-apiserver 上资源的变化,这里的资源主要指的是 Pod 和 Node
调度节点分配:通过预选(Predicates)与优选(Priorites)策略,为待调度的 Pod 分配一个 Node 进行绑定并填充nodeName,同时将分配结果通过 kube-apiserver 写入 etcd
[root@master01 k8s-cert]# cd .. //回到k8s工作目录
[root@master01 k8s]# tar zxvf kubernetes-server-linux-amd64.tar.gz //解压软件包
kubernetes/
kubernetes/server/
kubernetes/server/bin/
...
[root@master01 k8s]# cd kubernetes/server/bin/ //进入加压后软件命令存放目录
[root@master01 bin]# ls
apiextensions-apiserver kube-apiserver.docker_tag kube-proxy
cloud-controller-manager kube-apiserver.tar kube-proxy.docker_tag
cloud-controller-manager.docker_tag kube-controller-manager kube-proxy.tar
cloud-controller-manager.tar kube-controller-manager.docker_tag kube-scheduler
hyperkube kube-controller-manager.tar kube-scheduler.docker_tag
kubeadm kubectl kube-scheduler.tar
kube-apiserver kubelet mounter
ssl文件夹下面存储上面之前生成的apiserver的证书
cfg下面保存的是配置文件
/opt/kubernetes是k8s安装的根目录
kube-apiserver要配置访问etcd的证书
https://www.gaoyaqiu.com/post/kubernetes/07/
下载Server的二进制包
配置和启动 kube-apiserver
创建kube-apiserver配置文件
创建kube-apiserver.service文件
启动kube-apiserver
配置和启动 kube-controller-manager
创建 kube-controller-manager的serivce配置文件
创建kube-controller-manager.service文件
配置和启动 kube-scheduler
创建 kube-scheduler配置文件
启动kube-scheduler
验证 master 节点各组件状态
参考
master节点需要部署三个组件:kube-apiserver、kube-controller-manager、kube-scheduler
下载Server的二进制包
[root@master01 ~]# wget https://dl.k8s.io/v1.11.3/kubernetes-server-linux-amd64.tar.gz [root@master01 ~]# mkdir master_pkg [root@master01 ~]# mv kubernetes-server-linux-amd64.tar.gz master_pkg/ [root@master01 ~]# cd master_pkg [root@master01 master_pkg]# tar zxvf kubernetes-server-linux-amd64.tar.gz kubernetes/ kubernetes/LICENSES kubernetes/server/ kubernetes/server/bin/ kubernetes/server/bin/kube-scheduler.tar kubernetes/server/bin/kube-scheduler.docker_tag kubernetes/server/bin/kube-scheduler kubernetes/server/bin/cloud-controller-manager.tar kubernetes/server/bin/kube-apiserver kubernetes/server/bin/kube-controller-manager kubernetes/server/bin/kube-aggregator.tar kubernetes/server/bin/kube-proxy.docker_tag kubernetes/server/bin/kube-apiserver.tar kubernetes/server/bin/kube-controller-manager.docker_tag kubernetes/server/bin/cloud-controller-manager.docker_tag kubernetes/server/bin/kubectl kubernetes/server/bin/apiextensions-apiserver kubernetes/server/bin/kubelet kubernetes/server/bin/cloud-controller-manager kubernetes/server/bin/kube-proxy.tar kubernetes/server/bin/kube-controller-manager.tar kubernetes/server/bin/kube-apiserver.docker_tag kubernetes/server/bin/kube-proxy kubernetes/server/bin/hyperkube kubernetes/server/bin/kube-aggregator kubernetes/server/bin/kube-aggregator.docker_tag kubernetes/server/bin/kubeadm kubernetes/server/bin/mounter kubernetes/kubernetes-src.tar.gz kubernetes/addons/ [root@master01 master_pkg]# cd kubernetes/server/bin/ [root@master01 bin]# mv kube-controller-manager kube-scheduler kube-apiserver /opt/kubernetes/bin/ [root@master01 bin]# chmod +x /opt/kubernetes/bin/* [root@master01 bin]# cp ~/token.csv /opt/kubernetes/cfg/
配置和启动 kube-apiserver
创建kube-apiserver配置文件
[root@master01 bin]# export MASTER_ADDRESS="172.17.8.101" [root@master01 bin]# export ETCD_SERVERS="https://172.17.8.101:2379,https://172.17.8.103:2379,https://172.17.8.104:2379" [root@master01 bin]# cat <<EOF >/opt/kubernetes/cfg/kube-apiserver KUBE_APISERVER_OPTS="--logtostderr=true \ --v=4 \ --etcd-servers=${ETCD_SERVERS} \ --insecure-bind-address=0.0.0.0 \ --bind-address=${MASTER_ADDRESS} \ --insecure-port=8080 \ --secure-port=6443 \ --advertise-address=${MASTER_ADDRESS} \ --allow-privileged=true \ --service-cluster-ip-range=10.10.10.0/24 \ --admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota,NodeRestriction --authorization-mode=RBAC,Node \ --kubelet-https=true \ --enable-bootstrap-token-auth \ --token-auth-file=/opt/kubernetes/cfg/token.csv \ --service-node-port-range=30000-50000 \ --tls-cert-file=/opt/kubernetes/ssl/server.pem \ --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \ --client-ca-file=/opt/kubernetes/ssl/ca.pem \ --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \ --etcd-cafile=/opt/kubernetes/ssl/ca.pem \ --etcd-certfile=/opt/kubernetes/ssl/server.pem \ --etcd-keyfile=/opt/kubernetes/ssl/server-key.pem" EOF
主要参数说明:
- MASTER_ADDRESS kubernetes的master机器IP地址
- ETCD_SERVERS etcd的集群地址
- insecure-bind-address 绑定的http访问地址,这里设置为0.0.0.0,只为了测试使用,生产环境请设置为127.0.0.1
- bind-address 绑定的安全地址,供外部访问
- insecure-port 非安全的端口
- secure-port 安全的端口
- advertise-address 通告的地址,主要用于集群间的通信
- allow-privileged 允许授权,允许容器创建时启用这个授权
- service-cluster-ip-range 分配集群中serice负载均衡的IP范围
- admission-control 准入模块,只有所有模块都按配置的顺序,通过授权认证之后,才执行该请求
- authorization-mode 认证模块 RBAC: 基于角色的访问权限控制
- kubelet-https 启动https访问
- enable-bootstrap-token-auth 启用token认证(就是咱们创建的token.csv文件, 会下发到node节点上)
创建kube-apiserver.service文件
cat <<EOF >/usr/lib/systemd/system/kube-apiserver.service [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver ExecStart=/opt/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS Restart=on-failure [Install] WantedBy=multi-user.target EOF
启动kube-apiserver
https://www.cnblogs.com/Python-K8S/p/14120656.html