各组件二进制下载地址:
Client Binaries
Server Binaries
Node Binaries
etcd
flannel
可直接下载相关二进制文件然后上传到服务器直接解压即可,也可安装下面步骤在线下载安装。
1、组件版本
kubernetes 1.13.1
docker 17.06.0-ce
Etcd 3.3.10
Flanneld 0.10.0
TLS 认证通信(所有组件,如etcd、kubernetes master 和node)
kubelet TLS Bootstrapping
2、角色划分
k8s-master192.168.254.139k8s-masteretcd、kube-apiserver、kube-controller-manager、kube-scheduler
k8s-node-1192.168.254.147k8s-node-1etcd、kubelet、docker、kube_proxy flanneld
此集群采用一个master节点和一个node节点的方式。
集群中更多节点的添加还望各位举一反三。如果理解了这种方式,集群扩容相对来说就非常简单。
3、Master 节点部署
3.1下载软件到本地
wget
wget
wget
3.2 cfssl 安装
wget
wget
wget
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
3.3 创建etcd证书
//下面2行的mkdir命令,在所有节点中先执行。同时先建立共同的文件路径
mkdir /k8s/etcd/{bin,cfg,ssl} -p
mkdir /k8s/kubernetes/{bin,cfg,ssl} -p
//再回到主节点
cd /k8s/etcd/ssl/
1)etcd ca配置
cat << EOF | tee ca-config.json
{
“signing”: {
“default”: {
“expiry”: “87600h”
},
“profiles”: {
“etcd”: {
“expiry”: “87600h”,
“usages”: [
“signing”,
“key encipherment”,
“server auth”,
“client auth”
]
}
}
}
}
EOF
2)etcd ca证书
cat << EOF | tee ca-csr.json
{
“CN”: “etcd CA”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “Beijing”,
“ST”: “Beijing”
}
]
}
EOF
3)etcd server证书
下面需要特别注意,需要添加本机的127.0.0.1地址以及集群中所有ip的地址。
cat << EOF | tee server-csr.json
{
“CN”: “etcd”,
“hosts”: [
“127.0.0.1”,
“192.168.254.139”,
“192.168.254.147”
],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “Beijing”,
“ST”: “Beijing”
}
]
}
EOF
4)生成etcd ca证书和私钥 初始化ca
执行命令: cfssl gencert -initca ca-csr.json | cfssljson -bare ca
具体步骤如下:
[root@k8s-master ssl]# ls
ca-config.json ca-csr.json server-csr.json
[root@k8s-master ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
2019/03/20 16:13:54 [INFO] generating a new CA key and certificate from CSR
2019/03/20 16:13:54 [INFO] generate received request
2019/03/20 16:13:54 [INFO] received CSR
2019/03/20 16:13:54 [INFO] generating key: rsa-2048
2019/03/20 16:13:54 [INFO] encoded CSR
2019/03/20 16:13:54 [INFO] signed certificate with serial number 144752911121073185391033754516204538929473929443
[root@k8s-master ssll]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem server-csr.json
5) 生成server证书
执行命令:cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd server-csr.json | cfssljson -bare server
具体步骤如下:
[root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd server-csr.json | cfssljson -bare server
2019/03/20 16:18:53 [INFO] generate received request
2019/03/20 16:18:53 [INFO] received CSR
2019/03/20 16:18:53 [INFO] generating key: rsa-2048
2019/03/20 16:18:54 [INFO] encoded CSR
2019/03/20 16:18:54 [INFO] signed certificate with serial number 388122587040599986639159163167557684970159030057
2019/03/20 16:18:54 [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 (
specifically, section 10.2.3 (“Information Requirements”).
[root@k8s-master ssl]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem server.csr server-csr.json server-key.pem server.pem
至此,对应的ca证书私钥以及server证书已经生产完成。
对于这些内容,仅在集群中的master节点生成,
其余node节点是从这里拷贝过去的,不用node节点自己生成。
如果node节点自己生成相关证书内容,则会报如下错误:
(error “remote error: tls: bad certificate”, ServerName “”)
3.4 etcd安装
1)解压缩
tar -xvf etcd-v3.3.10-linux-amd64.tar.gz
cd etcd-v3.3.10-linux-amd64/
cp etcd etcdctl /k8s/etcd/bin/
2)配置etcd主文件
vim /k8s/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME=”etcd01″
ETCD_DATA_DIR=”/data1/etcd”
ETCD_LISTEN_PEER_URLS=””
ETCD_LISTEN_CLIENT_URLS=””
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS=””
ETCD_ADVERTISE_CLIENT_URLS=””
ETCD_INITIAL_CLUSTER=”etcd01=”
ETCD_INITIAL_CLUSTER_TOKEN=”etcd-cluster”
ETCD_INITIAL_CLUSTER_STATE=”new”
#[Security]
ETCD_CERT_FILE=”/k8s/etcd/ssl/server.pem”
ETCD_KEY_FILE=”/k8s/etcd/ssl/server-key.pem”
ETCD_TRUSTED_CA_FILE=”/k8s/etcd/ssl/ca.pem”
ETCD_CLIENT_CERT_AUTH=”true”
ETCD_PEER_CERT_FILE=”/k8s/etcd/ssl/server.pem”
ETCD_PEER_KEY_FILE=”/k8s/etcd/ssl/server-key.pem”
ETCD_PEER_TRUSTED_CA_FILE=”/k8s/etcd/ssl/ca.pem”
ETCD_PEER_CLIENT_CERT_AUTH=”true”
注解:
1>配置etcd主文件时,对应etcd.conf里面要写真实ip的内容
其中etcd. con f 中共有3部分内容,
[member]区域内容中写主节点ip
[Clustering] 区域内容中
——–ETCD_INITIAL_ADVERTISE_PEER_URLS和ETCD_ADVERTISE_CLIENT_URLS内容写主节点ip内容
——–ETCD_INITIAL_CLUSTER 内容中写主节点和从节点内容
[Security]内容中按照实际情况写真实路径即可
2>2379端口用于外部通信,2380用于内部通信
3>ETCD_NAME 为etcd节点在etcd集群中的标识,每一个都要唯一。
3)配置etcd启动文件
mkdir /data1/etcd
vim /usr/lib/systemd/system/etcd. Service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/data1/etcd/
EnvironmentFile=-/k8s/etcd/cfg/etcd.conf
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c “GOMAXPROCS=$(nproc) /k8s/etcd/bin/etcd –name=”${ETCD_NAME}” –data-dir=”${ETCD_DATA_DIR}” –listen-client-urls=”${ETCD_LISTEN_CLIENT_URLS}” –listen-peer-urls=”${ETCD_LISTEN_PEER_URLS}” –advertise-client-urls=”${ETCD_ADVERTISE_CLIENT_URLS}” –initial-cluster-token=”${ETCD_INITIAL_CLUSTER_TOKEN}” –initial-cluster=”${ETCD_INITIAL_CLUSTER}” –initial-cluster-state=”${ETCD_INITIAL_CLUSTER_STATE}” –cert-file=”${ETCD_CERT_FILE}” –key-file=”${ETCD_KEY_FILE}” –trusted-ca-file=”${ETCD_TRUSTED_CA_FILE}” –client-cert-auth=”${ETCD_CLIENT_CERT_AUTH}” –peer-cert-file=”${ETCD_PEER_CERT_FILE}” –peer-key-file=”${ETCD_PEER_KEY_FILE}” –peer-trusted-ca-file=”${ETCD_PEER_TRUSTED_CA_FILE}” –peer-client-cert-auth=”${ETCD_PEER_CLIENT_CERT_AUTH}””
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
注释:
1>配置etcd启动文件时,需要建立对应文件夹:/data1/etcd
建立这个路径的文件夹是根据上面etcd.conf中 ETCD_DATA_DIR 属性配置的路径而创建的对应路径。
2>在配置etcd的启动文件是:
/usr/lib/systemd/system/etcd.service
对应里面的参数ExecStart里面的很多内容都是使用 ${ETCD_NAME} 的方式读取的,对应相关内容都是从etcd.conf中的属性名称。
也就是,对应内容从etcd.conf中读取的。
原理就是根据EnvironmentFile配置内容,去读取文件,从里面读取相应的参数。
4)配置集群中其他节点的etcd服务
其他节点配置etcd,主要区别就是etcd.conf参数的内容。
其他步骤比如下载,安装,配置etcd启动文件都相同,这里不做介绍了。
如果有其他节点,etcd.con 配置文件中则需要更改的内容包括下面4个属性值:依次修改为node节点ip即可。
ETCD_NAME=”etcd02″
ETCD_LISTEN_PEER_URLS=””
ETCD_LISTEN_CLIENT_URLS=””
ETCD_INITIAL_ADVERTISE_PEER_URLS=””
ETCD_ADVERTISE_CLIENT_URLS=””
可参考我本机node节点中etcd的完成配置:
#[Member]
ETCD_NAME=”etcd02″
ETCD_DATA_DIR=”/data1/etcd”
ETCD_LISTEN_PEER_URLS=””
ETCD_LISTEN_CLIENT_URLS=””
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS=””
ETCD_ADVERTISE_CLIENT_URLS=””
ETCD_INITIAL_CLUSTER=”etcd01=”
ETCD_INITIAL_CLUSTER_TOKEN=”etcd-cluster”
ETCD_INITIAL_CLUSTER_STATE=”new”
#[Security]
ETCD_CERT_FILE=”/k8s/etcd/ssl/server.pem”
ETCD_KEY_FILE=”/k8s/etcd/ssl/server-key.pem”
ETCD_TRUSTED_CA_FILE=”/k8s/etcd/ssl/ca.pem”
ETCD_CLIENT_CERT_AUTH=”true”
ETCD_PEER_CERT_FILE=”/k8s/etcd/ssl/server.pem”
ETCD_PEER_KEY_FILE=”/k8s/etcd/ssl/server-key.pem”
ETCD_PEER_TRUSTED_CA_FILE=”/k8s/etcd/ssl/ca.pem”
ETCD_PEER_CLIENT_CERT_AUTH=”true”
5)启动 etcd
目前集群中的所有节点都配置了etcd。
etcd集群中所有节点都要执行下面命令。
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
注解:
1>systemctl daemon-reload 系统刷新加载配置文件
2>systemctl enable etcd 设置开机自启动
3>systemctl start etcd 启动etcd
后面的相关服务命令跟此处含义相同,不做单独介绍。
6)服务检查
对应 启动后,没有报错信息,可查看对应状态
然后检查对应etcd服务:
/k8s/etcd/bin/etcdctl –ca-file=/k8s/etcd/ssl/ca.pem –cert-file=/k8s/etcd/ssl/server.pem –key-file=/k8s/etcd/ssl/server-key.pem –endpoints=”” cluster-health
显示完整集群信息则表示安装完成!
注释:上面etcd.conf中各参数含义为:
etcd-name 节点名称
data-dir 指定节点的数据存储目录
listen-peer-urls 监听URL,用于与其他节点通讯
listen-client-urls 对外提供服务的地址:比如 ,客户端会连接到这里和 etcd 交互
initial-advertise-peer-urls 该节点同伴监听地址,这个值会告诉集群中其他节点
initial-cluster 集群中所有节点的信息,格式为 node1=… 。注意:这里的 node1 是节点的 –name 指定的名字;后面的 ip1:2380 是 –initial-advertise-peer-urls 指定的值
initial-cluster-state 新建集群的时候,这个值为 new ;假如已经存在的集群,这个值为 existing
initial-cluster-token 创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误
advertise-client-urls 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
3.5 生成kubernets证书与私钥
这里涉及到k8s集群中安全认证方式,Kubernetes集群安全设置共分2种,简单概括如下(有兴趣的朋友网上搜索下,这里不做介绍):
1、基于CA签名的双向数字证书认证方式。
2、基于HTTP BASE或TOKEN的简单认证方式。
1)制作kubernetes ca证书
其一:
cat << EOF | tee ca-config.json
{
“signing”: {
“default”: {
“expiry”: “87600h”
},
“profiles”: {
“kubernetes”: {
“expiry”: “87600h”,
“usages”: [
“signing”,
“key encipherment”,
“server auth”,
“client auth”
]
}
}
}
}
EOF
其二:
cat << EOF | tee ca-csr.json
{
“CN”: “kubernetes”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “Beijing”,
“ST”: “Beijing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
其三:
[root@k8s-master ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca –
2019/03/20 09:47:08 [INFO] generating a new CA key and certificate from CSR
2019/03/20 09:47:08 [INFO] generate received request
2019/03/20 09:47:08 [INFO] received CSR
2019/03/20 09:47:08 [INFO] generating key: rsa-2048
2019/03/20 09:47:08 [INFO] encoded CSR
2019/03/20 09:47:08 [INFO] signed certificate with serial number 156611735285008649323551446985295933852737436614
[root@k8s-master ssl]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
2)制作apiserver证书
cat << EOF | tee server-csr.json
{
“CN”: “kubernetes”,
“hosts”: [
“10.254.0.1”,
“127.0.0.1”,
“192.168.254.139”,
“192.168.254.147”,
“kubernetes”,
“kubernetes.default”,
“kubernetes.default.svc”,
“kubernetes.default.svc.cluster”,
“kubernetes.default.svc.cluster.local”
],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “Beijing”,
“ST”: “Beijing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
特别注意:
如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表,所以上面分别指定了当前部署的 master 节点主机 IP 以及apiserver 负载的内部域名
还需要添加 kube-apiserver 注册的名为 kubernetes 的服务 IP (Service Cluster IP),一般是kube-apiserver 文件中service-cluster-ip-range属性选项值指定的网段的第一个IP,如”10.254.0.1″(下面会介绍)
执行命令:
[root@k8s-master ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
2019/03/20 09:51:56 [INFO] generate received request
2019/03/20 09:51:56 [INFO] received CSR
2019/03/20 09:51:56 [INFO] generating key: rsa-2048
2019/03/20 09:51:56 [INFO] encoded CSR
2019/03/20 09:51:56 [INFO] signed certificate with serial number 399376216731194654868387199081648887334508501005
2019/03/20 09:51:56 [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 (
specifically, section 10.2.3 (“Information Requirements”).
[root@k8s-master ssl]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem server.csr server-csr.json server-key.pem server.pem
3)制作kube-proxy证书
需要注意的是:尽管kube-proxy 组件为node节点需要部署的内容,master节点不需要部署,但是,对应相关证书必须且只能在master节点上生成。
也就是k8s集群中的所有相关证书都必须在master节点中生成。
cat << EOF | tee kube-proxy-csr.json
{
“CN”: “system:kube-proxy”,
“hosts”: [],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “Beijing”,
“ST”: “Beijing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
执行命令:
[root@k8s-master ssl]# 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/03/20 09:52:40 [INFO] generate received request
2019/03/20 09:52:40 [INFO] received CSR
2019/03/20 09:52:40 [INFO] generating key: rsa-2048
2019/03/20 09:52:40 [INFO] encoded CSR
2019/03/20 09:52:40 [INFO] signed certificate with serial number 633932731787505365511506755558794469389165123417
2019/03/20 09:52:40 [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 (
specifically, section 10.2.3 (“Information Requirements”).
[root@k8s-master ssl]# ls
ca-config.json ca-csr.json ca.pem kube-proxy-csr.json kube-proxy.pem server-csr.json server.pem
ca.csr ca-key.pem kube-proxy.csr kube-proxy-key.pem server.csr server-key.pem
3.6 部署kubernetes server
kubernetes master 节点运行如下组件: kube-apiserver kube-scheduler kube-controller-manager kube-scheduler 和 kube-controller-manager 可以以集群模式运行,通过 leader 选举产生一个工作进程,其它进程处于阻塞模式,master三节点高可用模式下可用
1)解压缩文件
wget
tar -zxvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin/
cp kube-scheduler kube-apiserver kube-controller-manager kubectl /k8s/kubernetes/bin/
2)部署kube-apiserver组件 创建TLS Bootstrapping Token
此步骤在主节点上操作
[root@k8s-master bin]# head -c 16 /dev/urandom | od -An -t x | tr -d ‘ ‘
1ad22961548bc5d0deaf8972d144f176
vim /k8s/kubernetes/cfg/token.csv
1ad22961548bc5d0deaf8972d144f176,kubelet-bootstrap,10001,”system:kubelet-bootstrap”
注释:
kubelet 首次启动时向kube-apiserver 发送TLS Bootstrapping 请求,kube-apiserver 验证请求中的token 是否与它配置的token.csv 一致,如果一致则自动为kubelet 生成证书和密钥。
2.1)创建Apiserver配置文件
vim /k8s/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS=”–logtostderr=true
–v=4
–etcd-servers=
–bind-address=10.2.8.44
–secure-port=6443
–advertise-address=10.2.8.44
–allow-privileged=true
–service-cluster-ip-range=10.254.0.0/16
–enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction
–authorization-mode=RBAC,Node
–enable-bootstrap-token-auth
–token-auth-file=/k8s/kubernetes/cfg/token.csv
–service-node-port-range=30000-50000
–tls-cert-file=/k8s/kubernetes/ssl/server.pem
–tls-private-key-file=/k8s/kubernetes/ssl/server-key.pem
–client-ca-file=/k8s/kubernetes/ssl/ca.pem
–service-account-key-file=/k8s/kubernetes/ssl/ca-key.pem
–etcd-cafile=/k8s/etcd/ssl/ca.pem
–etcd-certfile=/k8s/etcd/ssl/server.pem
–etcd-keyfile=/k8s/etcd/ssl/server-key.pem”
注释:
参数说明:后面属性内容参考后续更新的关于k8s集群中各组件参数详解内容。
//开启日志
logtostderr=true
//日志级别
–v=4
//etcd 服务的URL列表
–etcd-servers=
//k8s API Server 在本地址的6443端口开启安全的HTTPS服务,默认为 0.0.0.0
–bind-address=10.2.8.44
//设置API Server 使用HTTPS安全模式端口号,设置为0表示不启动HTTPS
–secure-port=6443
//用于广播给集群的所有成员的IP地址,不指定该地址将使用”–bind-address”定义的IP地址
–advertise-address=10.2.8.44
//如果设置为true,则k8s将允许在pod中运行拥有系统特权的容器应用,与docker run –privileged 的功效相同
–allow-privileged=true
//Service的Cluster IP(虚拟IP)池,例如:169.169.0.0/16,这个IP地址池不能与物理机所在的网络重合
–service-cluster-ip-range=10.254.0.0/16
//到 API Server 的安全访问的认证模式列表,以逗号分隔,可
–authorization-mode=RBAC,Node
//token 内容存放文件
–token-auth-file=/k8s/kubernetes/cfg/token.csv
//Service 的 NodePort 能使用的主机端口号范围,默认为30000~32767,包括30000和32767
–service-node-port-range=30000-50000
2.2)创建apiserver systemd文件
vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=
[Service]
EnvironmentFile=-/k8s/kubernetes/cfg/kube-apiserver
ExecStart=/k8s/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
2.3)启动服务
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl start kube-apiserver
然后观察启动后apiserver的状态
systemctl status kube-apiserver
如下信息则表示安装成功。
可以继续输入命令查看运行的状态
ps -ef |grep kube-apiserver
netstat -tulpn |grep kube-apiserve
3)部署kube-scheduler组件 创建kube-scheduler配置文件
vim /k8s/kubernetes/cfg/kube-scheduler
KUBE_SCHEDULER_OPTS=”–logtostderr=true –v=4 –master=127.0.0.1:8080 –leader-elect”
参数备注: –leader-elect=true:集群运行模式,启用选举功能;被选为 leader 的节点负责处理工作,其它节点为阻塞状态;
3.1)创建kube-scheduler systemd文件
vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=
[Service]
EnvironmentFile=-/k8s/kubernetes/cfg/kube-scheduler
ExecStart=/k8s/kubernetes/bin/kube-scheduler $KUBE_SCHEDULER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
3.2)启动服务
systemctl daemon-reload
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service
然后观察启动后scheduler的状态
systemctl status kube-scheduler.service
4)部署kube-controller-manager组件 创建kube-controller-manager配置文件
vim /k8s/kubernetes/cfg/kube-controller-manager
KUBE_CONTROLLER_MANAGER_OPTS=”–logtostderr=true
–v=4
–master=127.0.0.1:8080
–leader-elect=true
–address=127.0.0.1
–service-cluster-ip-range=10.254.0.0/16
–cluster-name=kubernetes
–cluster-signing-cert-file=/k8s/kubernetes/ssl/ca.pem
–cluster-signing-key-file=/k8s/kubernetes/ssl/ca-key.pem
–root-ca-file=/k8s/kubernetes/ssl/ca.pem
–service-account-private-key-file=/k8s/kubernetes/ssl/ca-key.pem”
4.1)创建kube-controller-manager systemd文件
vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=
[Service]
EnvironmentFile=-/k8s/kubernetes/cfg/kube-controller-manager
ExecStart=/k8s/kubernetes/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
4.2)启动服务
systemctl daemon-reload
systemctl enable kube-controller-manager
systemctl start kube-controller-manager
然后观察启动后controller-manage的状态
systemctl status kube-controller-manager.service
3.7验证kubeserver服务
设置环境变量
vim /etc/profile
export PATH=/k8s/kubernetes/bin:$PATH
source /etc/profile
查看master服务状态
[root@k8s-master bin]# kubectl get cs,nodes
NAME STATUS MESSAGE ERROR
componentstatus/controller-manager Healthy ok
componentstatus/scheduler Healthy ok
componentstatus/etcd-0 Healthy {“health”:”true”}
componentstatus/etcd-1 Healthy {“health”:”true”}
主节点内容部署完成。
3.8 部署kubectl命令行工具
可能有一部分不太理解,怎么需要部署kubectl的命令行工具,刚才查看master服务状态的命令:
kubectl get cs,node
明明命令可以使用,而且本省以后有kubelet组件。为什么还需要部署kubectl工具。
其实,这个文件目前在主节点还不会有问题,kubectl命令可以使用,
如果部署了node节点,在对应的node节点上是不可以使用kubectl命令的,
会报如下错误:
kubectl 是 kubernetes 集群的命令行管理工具,本文档介绍安装和配置它的步骤。
kubectl 默认从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息,如果没有配置,执行 kubectl 命令时就可能报上面的错误。
因为上面我们我已经有对应kubectl组件,这里不许在下载。如果没有kubectl组件的,可使用下面操作下载并拷贝到对应需要的主机。
wget
tar -xzvf kubernetes-client-linux-amd64.tar.gz
1>创建 admin 证书和私钥
kubectl 与 apiserver https 安全端口通信,apiserver 对提供的证书进行认证和授权。
kubectl 作为集群的管理工具,需要被授予最高权限。这里创建具有最高权限的 admin 证书。
创建证书签名请求:
cd /k8s/kubernetes/ssl
cat > admin-csr.json <<EOF
{
“CN”: “admin”,
“hosts”: [],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “system:masters”,
“OU”: “4Paradigm”
}
]
}
EOF
注释:
O 为 system:masters,kube-apiserver 收到该证书后将请求的 Group 设置为 system:masters;
预定义的 ClusterRoleBinding cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予所有 API的权限;
该证书只会被 kubectl 当做 client 证书使用,所以 hosts 字段为空;
生成证书和私钥:
[root@k8s-master ssl]# cfssl gencert -ca=/opt/k8s/work/ca.pem
-ca-key=/opt/k8s/work/ca-key.pem
-config=/opt/k8s/work/ca-config.json
-profile=kubernetes admin-csr.json | cfssljson -bare admin
[root@k8s-master ssl]# ls admin*
admin.csr admin-csr.json admin-key.pem admin.pem
2>创建 kubeconfig 文件
kubeconfig 为 kubectl 的配置文件,包含访问 apiserver 的所有信息,如 apiserver 地址、CA 证书和自身使用的证书;
cd /k8s/kubernetes/cfg
vi /k8s/kubernetes/cfg/environment.sh
#主节点IP地址
KUBE_APISERVER=””
# 设置集群参数
kubectl config set-cluster kubernetes
–certificate-authority=/k8s/kubernetes/ssl/ca.pem
–embed-certs=true
–server=${KUBE_APISERVER}
–kubeconfig=kubectl.kubeconfig
# 设置客户端认证参数
kubectl config set-credentials admin
–client-certificate=/k8s/kubernetes/ssl/admin.pem
–client-key=/k8s/kubernetes/ssl/admin-key.pem
–embed-certs=true
–kubeconfig=kubectl.kubeconfig
# 设置上下文参数
kubectl config set-context kubernetes
–cluster=kubernetes
–user=admin
–kubeconfig=kubectl.kubeconfig
# 设置默认上下文
kubectl config use-context kubernetes –kubeconfig=kubectl.kubeconfig
注释:
–certificate-authority:验证 kube-apiserver 证书的根证书;
–client-certificate、–client-key:刚生成的 admin 证书和私钥,连接 kube-apiserver 时使用;
–embed-certs=true:将 ca.pem 和 admin.pem 证书内容嵌入到生成的 kubectl.kubeconfig 文件中(不加时,写入的是证书文件路径);
执行 environment.sh 脚本:
sh environment.sh
生成 kubectl.kubeconfig 文件
3>分发kubeconfig 文件
拷贝到本机的 ~/.kube/config 中
cp kubectl.kubeconfig ~/.kube/config
拷贝到node节点上
scp kubectl.kubeconfig root@192.168.254.147:~/.kube/config
4、Node 部署
如上述内容可知,node节点的组件包括: docker kubelet kube-proxy flannel
根据操作顺序可以先配置环境变量:
vim /etc/profile
export PATH=/k8s/kubernetes/bin:$PATH
source /etc/profile
4.1 Docker环境安装
此步骤包括:切换k8s源、关闭防火墙和selinux、禁用swap、设置ipv4 转发、
选择对应docker版本安装内容。
这里不做详细介绍,不清楚的可查看kubeadm安装k8s集群的文章内容。
4.2 部署kubelet组件
kublet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如exec、run、logs 等; kublet 启动时自动向 kube-apiserver 注册节点信息,内置的 cadvisor 统计和监控节点的资源使用情况; 为确保安全,只开启接收 https 请求的安全端口,对请求进行认证和授权,拒绝未授权的访问(如apiserver、heapster)
1)安装二进制文件
wget
tar zxvf kubernetes-node-linux-amd64.tar.gz
cd kubernetes/node/bin/
cp kube-proxy kubelet kubectl /k8s/kubernetes/bin/
2)复制相关证书到node节点
此操作在master节点上操作。
scp *.pem 192.168.254.147:/k8s/etcd/ssl
拷贝内容包括:
ca-key.pem、ca.pem、kube-proxy-key.pem、kube-proxy.pem、server-key.pem、server.pem
3)创建kubelet bootstrap kubeconfig文件 通过脚本实现
vim /k8s/kubernetes/cfg/environment.sh
#!/bin/bash
#创建kubelet bootstrapping kubeconfig。此为主节点生成的token
BOOTSTRAP_TOKEN=1ad22961548bc5d0deaf8972d144f176
#主节点IP地址
KUBE_APISERVER=””
#设置集群参数
kubectl config set-cluster kubernetes
–certificate-authority=/k8s/kubernetes/ssl/ca.pem
–embed-certs=true
–server=${KUBE_APISERVER}
–kubeconfig=bootstrap.kubeconfig
#设置客户端认证参数
kubectl config set-credentials kubelet-bootstrap
–token=${BOOTSTRAP_TOKEN}
–kubeconfig=bootstrap.kubeconfig
# 设置上下文参数
kubectl config set-context default
–cluster=kubernetes
–user=kubelet-bootstrap
–kubeconfig=bootstrap.kubeconfig
# 设置默认上下文
kubectl config use-context default –kubeconfig=bootstrap.kubeconfig
#———————-
# 创建kube-proxy kubeconfig文件
kubectl config set-cluster kubernetes
–certificate-authority=/k8s/kubernetes/ssl/ca.pem
–embed-certs=true
–server=${KUBE_APISERVER}
–kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy
–client-certificate=/k8s/kubernetes/ssl/kube-proxy.pem
–client-key=/k8s/kubernetes/ssl/kube-proxy-key.pem
–embed-certs=true
–kubeconfig=kube-proxy.kubeconfig
kubectl config set-context default
–cluster=kubernetes
–user=kube-proxy
–kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default –kubeconfig=kube-proxy.kubeconfig
执行脚本:
sh environment.sh
对应打印信息如下:
查看脚本执行结果,生成了2个文件:
bootstrap.kubeconfig和kube-proxy.kubeconfig
5)创建kubelet配置文件
vim /k8s/kubernetes/cfg/kubelet
KUBELET_OPTS=”–logtostderr=true
–v=4
–hostname-override=192.168.254.147
–kubeconfig=/k8s/kubernetes/cfg/kubelet.kubeconfig
–bootstrap-kubeconfig=/k8s/kubernetes/cfg/bootstrap.kubeconfig
–config=/k8s/kubernetes/cfg/kubelet.config
–cert-dir=/k8s/kubernetes/ssl
–pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0″
6)创建kubelet systemd文件
vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=/k8s/kubernetes/cfg/kubelet
ExecStart=/k8s/kubernetes/bin/kubelet $KUBELET_OPTS
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
7)将kubelet-bootstrap用户绑定到系统集群角色
执行命令在主节点上执行:
kubectl create clusterrolebinding kubelet-bootstrap
–clusterrole=system:node-bootstrapper
–user=kubelet-bootstrap
内容如下:
打印
clusterrolebinding.rbac.authorization.k8s.io/kubelet-bootstrap created 则表示成功。
8)启动服务
systemctl daemon-reload
systemctl enable kubelet
启动kubelet:
systemctl start kubelet
查看kubelet状态
systemctl status kubelet
9)Master接受kubelet CSR请求 可以手动或自动 approve CSR 请求。推荐使用自动的方式,因为从 v1.8 版本开始,可以自动轮转approve csr 后生成的证书,如下是手动 approve CSR请求操作方法 查看CSR列表。
在Master节点执行命令!!!
查看CSR列表:
接受node
执行命令:
kubectl certificate approve node-csr-eziTF9NUdu9dLDvHSmWUJXEaY9RCsGFA8XlMxYuksD4
再查看CSR
4.3部署kube-proxy组件
kube-proxy 运行在所有 node节点上,它监听 apiserver 中 service 和 Endpoint 的变化情况,创建路由规则来进行服务负载均衡 1)创建 kube-proxy 配置文件
vim /k8s/kubernetes/cfg/kube-proxy
KUBE_PROXY_OPTS=”–logtostderr=true
–v=4
–hostname-override=192.168.254.147
–cluster-cidr=10.254.0.0/16
–kubeconfig=/k8s/kubernetes/cfg/kube-proxy.kubeconfig”
2)创建kube-proxy systemd文件
vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=-/k8s/kubernetes/cfg/kube-proxy
ExecStart=/k8s/kubernetes/bin/kube-proxy $KUBE_PROXY_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
3)启动服务
systemctl daemon-reload
systemctl enable kube-proxy
启动kube-proxy:
systemctl start kube-proxy
查看kube-proxy状态
systenctl status kube-proxy
4)查看集群状态:
在主节点或者node节点查询都可以:
5)如果有其他node节点,同样的操作部署到其他节点并认证csr,认证后会生成kubelet-client证书
注意期间要是kubelet,kube-proxy配置错误,比如监听IP或者hostname错误导致node not found,需要删除kubelet-client证书,重启kubelet服务,重启认证csr即可
5、Flanneld网络部署
默认没有flanneld网络,Node节点间的pod不能通信,只能Node内通信,为了部署步骤简洁明了,故flanneld放在后面安装 flannel服务需要先于docker启动。flannel服务启动时主要做了以下几步的工作: 从etcd中获取network的配置信息 划分subnet,并在etcd中进行注册 将子网信息记录到/run/flannel/subnet.env中
5.1 etcd注册网段
执行命令:
/k8s/etcd/bin/etcdctl –ca-file=/k8s/etcd/ssl/ca.pem –cert-file=/k8s/etcd/ssl/server.pem –key-file=/k8s/etcd/ssl/server-key.pem –endpoints=”” set /k8s/network/config ‘{ “Network”: “10.254.0.0/16”, “Backend”: {“Type”: “vxlan”}}’
[root@k8s-node-1 cfg]# /k8s/etcd/bin/etcdctl –ca-file=/k8s/etcd/ssl/ca.pem –cert-file=/k8s/etcd/ssl/server.pem –key-file=/k8s/etcd/ssl/server-key.pem –endpoints=”” set /k8s/network/config ‘{ “Network”: “10.254.0.0/16”, “Backend”: {“Type”: “vxlan”}}’
如果打印出下面内容,则表示成功
注解:
flanneld 当前版本 (v0.10.0) 不支持 etcd v3,故使用 etcd v2 API 写入配置 key 和网段数据; 写入的 Pod 网段 ${CLUSTER_CIDR} 必须是 /16 段地址,必须与 kube-controller-manager 的 –cluster-cidr 参数值一致;
6.2 flannel安装
1)解压安装
wget
tar -xvf flannel-v0.10.0-linux-amd64.tar.gz
mv flanneld mk-docker-opts.sh /k8s/kubernetes/bin/
2)配置flanneld
vim /k8s/kubernetes/cfg/flanneld
FLANNEL_OPTIONS=”–etcd-endpoints= -etcd-cafile=/k8s/etcd/ssl/ca.pem -etcd-certfile=/k8s/etcd/ssl/server.pem -etcd-keyfile=/k8s/etcd/ssl/server-key.pem -etcd-prefix=/k8s/network”
2.1)创建flanneld systemd文件
vim /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/k8s/kubernetes/cfg/flanneld
ExecStart=/k8s/kubernetes/bin/flanneld –ip-masq $FLANNEL_OPTIONS
ExecStartPost=/k8s/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure
[Install]
WantedBy=multi-user.target
注意:
mk-docker-opts.sh 脚本将分配给 flanneld 的 Pod 子网网段信息写入 /run/flannel/docker 文件,后续 docker 启动时 使用这个文件中的环境变量配置 docker0 网桥; flanneld 使用系统缺省路由所在的接口与其它节点通信,对于有多个网络接口(如内网和公网)的节点,可以用 -iface 参数指定通信接口; flanneld 运行时需要 root 权限;
3)配置Docker启动指定子网 修改EnvironmentFile=/run/flannel/subnet.env,ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS即可
vim /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
4)启动服务 注意启动flannel前要关闭docker及相关的kubelet这样flannel才会覆盖docker0网桥
执行命令依次如下:
systemctl daemon-reload
systemctl stop docker
systemctl start flanneld
systemctl enable flanneld
systemctl start docker
systemctl restart kubelet
systemctl restart kube-proxy
查看相关flannel状态:
上述命令如果没有报错,则说明成功了,也可以使用systemctl status 命令查看相关状态。
4.1)验证服务:
输入ip a
也可以使用 ifconfig
查询节点:
k8s集群搭建完成。