kubernetes集群搭建系列之 kubeadm方式部署:
本系列系文档适用于 CentOS 7、Ubuntu 16.04 及以上版本系统,由于启用了 TLS 双向认证、RBAC 授权等严格的安全机制,建议从头开始部署,否则可能会认证、授权等失败!
1. 组件版本 && 集群环境 组件版本
KKubernetes 1.8.2(1.9.x版本也可以,只有细微的差别)
Docker 17.10.0-ce
Etcd 3.2.9
Flanneld
TLS 认证通信(所有组件,如etcd、kubernetes master 和node)
RBAC 授权
kubelet TLS Bootstrapping
kubedns、dashboard、heapster等插件
harbor,使用nfs后端存储
etcd 集群 && k8s master 机器 && k8s node 机器
master01:192.168.1.137
master02:192.168.1.138
master03/node03:192.168.1.170
由于机器有限,所以我们将master03 也作为node 节点,后续有新的机器增加即可
node01: 192.168.1.161
node02: 192.168.1.162
集群环境变量 后面的嗯部署将会使用到的全局变量,定义如下(根据自己的机器、网络修改):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 BOOTSTRAP_TOKEN ="8981b594122ebed7596f1d3b69c78223" SERVICE_CIDR ="10.254.0.0/16" CLUSTER_CIDR ="172.30.0.0/16" NODE_PORT_RANGE ="30000-32766" ETCD_ENDPOINTS ="https://192.168.1.137:2379,https://192.168.1.138:2379,https://192.168.1.170:2379" FLANNEL_ETCD_PREFIX ="/kubernetes/network" CLUSTER_KUBERNETES_SVC_IP ="10.254.0.1" CLUSTER_DNS_SVC_IP ="10.254.0.2" CLUSTER_DNS_DOMAIN ="cluster.local." MASTER_URL ="k8s-api.virtual.local"
将上面变量保存为: env.sh,然后将脚本拷贝到所有机器的/usr/k8s/bin目录。 为方便后面迁移,我们在集群内定义一个域名用于访问apiserver,在每个节点的/etc/hosts文件中添加记录:192.168.1.137 k8s-api.virtual.local k8s-api
其中192.168.1.137为master01 的IP,暂时使用该IP 来做apiserver 的负载地址
如果你使用的是阿里云的ECS 服务,强烈建议你先将上述节点的安全组配置成允许所有访问,不然在安装过程中会遇到各种访问不了的问题,待集群配置成功以后再根据需要添加安全限制。
2. 创建CA 证书和密钥 kubernetes 系统各个组件需要使用TLS证书对通信进行加密,这里我们使用CloudFlare的PKI 工具集cfssl 来生成Certificate Authority(CA) 证书和密钥文件, CA 是自签名的证书,用来签名后续创建的其他TLS 证书。
安装 CFSSL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 $ chmod +x cfssl_linux-amd64$ sudo mv cfssl_linux-amd64 /usr/k8s/bin/cfssl$ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 $ chmod +x cfssljson_linux-amd64$ sudo mv cfssljson_linux-amd64 /usr/k8s/bin/cfssljson$ wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 $ chmod +x cfssl-certinfo_linux-amd64$ sudo mv cfssl-certinfo_linux-amd64 /usr/k8s/bin/cfssl-certinfo$ export PATH=/usr/k8s/bin:$PATH $ mkdir ssl && cd ssl$ cfssl print-defaults config > config.json $ cfssl print-defaults csr > csr.json
为了方便,将/usr/k8s/bin设置成环境变量,为了重启也有效,可以将上面的export PATH=/usr/k8s/bin:$PATH添加到/etc/rc.local文件中。
创建CA 修改上面创建的config.json文件为ca-config.json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ cat ca-config .json { "signing" : { "default" : { "expiry" : "87600h" }, "profiles" : { "kubernetes" : { "expiry" : "87600h" , "usages" : [ "signing" , "key encipherment" , "server auth" , "client auth" ] } } } }
config.json:可以定义多个profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个profile;
signing: 表示该证书可用于签名其它证书;生成的ca.pem 证书中CA=TRUE;
server auth: 表示client 可以用该CA 对server 提供的证书进行校验;
client auth: 表示server 可以用该CA 对client 提供的证书进行验证。
修改CA 证书签名请求为ca-csr.json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ cat ca-csr .json { "CN" : "kubernetes" , "key" : { "algo" : "rsa" , "size" : 2048 }, "names" : [ { "C" : "CN" , "L" : "BeiJing" , "ST" : "BeiJing" , "O" : "k8s" , "OU" : "System" } ] }
CN: Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名(User Name);浏览器使用该字段验证网站是否合法;
O: Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组(Group);
生成CA 证书和私钥:
1 2 3 $ cfssl gencert -initca ca -csr.json | cfssljson -bare ca $ ls ca * $ ca -config.json ca .csr ca -csr.json ca -key.pem ca .pem
分发证书 将生成的CA 证书、密钥文件、配置文件拷贝到所有机器的/etc/kubernetes/ssl目录下面:
1 2 $ sudo mkdir -p /etc/kubernetes/ssl$ sudo cp ca* /etc/kubernetes/ssl
3. 部署高可用etcd 集群 kubernetes 系统使用etcd存储所有的数据,我们这里部署3个节点的etcd 集群,这3个节点直接复用kubernetes master的3个节点,分别命名为etcd01、etcd02、etcd03:
etcd01:192.168.1.137
etcd02:192.168.1.138
etcd03:192.168.1.170
定义环境变量 使用到的变量如下:
1 2 3 4 5 6 7 $ export NODE_NAME=etcd01 $ export NODE_IP=192.168.1.137 $ export NODE_IPS="192.168.1.137 192.168.1.138 192.168.1.170" $ $ export ETCD_NODES=etcd01=https://192.168.1.137:2380,etcd02=https://192.168.1.138:2380,etcd03=https://192.168.1.170:2380$ $ source /usr/k8s/bin/env.sh
33 下载etcd 二进制文件 到https://github.com/coreos/etcd/releases页面下载最新版本的二进制文件:
1 2 3 $ wget https://github.com/coreos/etcd/releases/download/v3.2.9/etcd-v3.2.9-linux-amd64.tar.gz $ tar -xvf etcd-v3.2.9-linux-amd64.tar.gz $ sudo mv etcd-v3.2.9-linux-amd64/etcd* /usr/k8s/bin/
创建TLS 密钥和证书 为了保证通信安全,客户端(如etcdctl)与etcd 集群、etcd 集群之间的通信需要使用TLS 加密。
创建etcd 证书签名请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 $ cat > etcd-csr .json <<EOF{ "CN" : "etcd" , "hosts" : [ "127.0.0.1" , "$ {NODE_IP}" ], "key" : { "algo" : "rsa" , "size" : 2048 }, "names" : [ { "C" : "CN" , "ST" : "BeiJing" , "L" : "BeiJing" , "O" : "k8s" , "OU" : "System" } ] } EOF
hosts 字段指定授权使用该证书的etcd节点IP
生成etcd证书和私钥:
1 2 3 4 5 6 7 8 $ cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \ -ca-key=/etc/kubernetes/ssl/ca-key.pem \ -config=/etc/kubernetes/ssl/ca-config.json \ -profile=kubernetes etcd-csr.json | cfssljson -bare etcd $ ls etcd*etcd.csr etcd-csr.json etcd-key.pem etcd.pem $ sudo mkdir -p /etc/etcd/ssl$ sudo mv etcd*.pem /etc/etcd/ssl/
创建etcd 的systemd unit 文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 $ sudo mkdir -p /var/lib/etcd # 必须要先创建工作目录 $ cat > etcd.service <<EOF [Unit ] Description =Etcd Server After =network.target After =network-online.target Wants =network-online.target Documentation =https://github.com/coreos [Service ] Type =notify WorkingDirectory =/var/lib/etcd/ ExecStart =/usr/k8s/bin/etcd \\ --name =$ {NODE_NAME} \\ --cert-file =/etc/etcd/ssl/etcd.pem \\ --key-file =/etc/etcd/ssl/etcd-key.pem \\ --peer-cert-file =/etc/etcd/ssl/etcd.pem \\ --peer-key-file =/etc/etcd/ssl/etcd-key.pem \\ --trusted-ca-file =/etc/kubernetes/ssl/ca.pem \\ --peer-trusted-ca-file =/etc/kubernetes/ssl/ca.pem \\ --initial-advertise-peer-urls =https://$ {NODE_IP} :2380 \\ --listen-peer-urls =https://$ {NODE_IP} :2380 \\ --listen-client-urls =https://$ {NODE_IP} :2379 ,http: //127.0.0.1:2379 \\ --advertise-client-urls =https://$ {NODE_IP} :2379 \\ --initial-cluster-token =etcd-cluster-0 \\ --initial-cluster =$ {ETCD_NODES} \\ --initial-cluster-state =new \\ --data-dir =/var/lib/etcd Restart =on-failure RestartSec =5 LimitNOFILE =65536 [Install ] WantedBy =multi-user.target EOF
指定etcd的工作目录和数据目录为/var/lib/etcd,需要在启动服务前创建这个目录;
为了保证通信安全,需要指定etcd 的公私钥(cert-file和key-file)、Peers通信的公私钥和CA 证书(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客户端的CA 证书(trusted-ca-file);
–initial-cluster-state值为new时,–name的参数值必须位于–initial-cluster列表中;
启动etcd 服务 1 2 3 4 5 $ sudo mv etcd.service /etc/systemd/system/$ sudo systemctl daemon-reload$ sudo systemctl enable etcd$ sudo systemctl start etcd$ sudo systemctl status etcd
最先启动的etcd 进程会卡住一段时间,等待其他节点启动加入集群,在所有的etcd 节点重复上面的步骤,直到所有的机器etcd 服务都已经启动。
33 验证服务 部署完etcd 集群后,在任一etcd 节点上执行下面命令:
1 2 3 4 5 6 7 for ip in ${NODE_IPS} ; do ETCDCTL_API =3 /usr/k8s/bin/etcdctl \ --endpoints =https://${ip}:2379 \ --cacert =/etc/kubernetes/ssl/ca.pem \ --cert =/etc/etcd/ssl/etcd.pem \ --key =/etc/etcd/ssl/etcd-key.pem \ endpoint health; done
输出如下结果:
1 2 3 https ://192.168.1.137:2379 is healthy: successfully committed proposal: took = 1 .509032 mshttps ://192.168.1.138:2379 is healthy: successfully committed proposal: took = 1 .639228 mshttps ://192.168.1.170:2379 is healthy: successfully committed proposal: took = 1 .4152 ms
可以看到上面的信息3个节点上的etcd 均为healthy,则表示集群服务正常。
接下文:手动搭建高可用的kubernetes集群(二)