您的位置 首页 java

一篇文章讲清楚kubernetes集群通过离线二进制的方式搭建过程

各组件二进制下载地址:

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集群搭建完成。

文章来源:智云一二三科技

文章标题:一篇文章讲清楚kubernetes集群通过离线二进制的方式搭建过程

文章地址:https://www.zhihuclub.com/193522.shtml

关于作者: 智云科技

热门文章

网站地图