环境准备:node
master01:192.168.150.128linux
master02:192.168.150.130git
master03:192.168.150.131github
node01:192.168.150.132json
lb01:192.168.150.133api
lb02:192.168.150.134浏览器
后面的嗯部署将会使用到的全局变量,定义以下(根据本身的机器、网络修改):安全
# TLS Bootstrapping 使用的Token,可使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成 BOOTSTRAP_TOKEN="8981b594122ebed7596f1d3b69c78223" # 建议使用未用的网段来定义服务网段和Pod 网段 # 服务网段(Service CIDR),部署前路由不可达,部署后集群内部使用IP:Port可达 SERVICE_CIDR="10.254.0.0/16" # Pod 网段(Cluster CIDR),部署前路由不可达,部署后路由可达(flanneld 保证) CLUSTER_CIDR="172.30.0.0/16" # 服务端口范围(NodePort Range) NODE_PORT_RANGE="30000-32766" # etcd集群服务地址列表 ETCD_ENDPOINTS="https://192.168.1.137:2379,https://192.168.1.138:2379,https://192.168.1.170:2379" # flanneld 网络配置前缀 FLANNEL_ETCD_PREFIX="/kubernetes/network" # kubernetes 服务IP(预先分配,通常为SERVICE_CIDR中的第一个IP) CLUSTER_KUBERNETES_SVC_IP="10.254.0.1" # 集群 DNS 服务IP(从SERVICE_CIDR 中预先分配) CLUSTER_DNS_SVC_IP="10.254.0.2" # 集群 DNS 域名 CLUSTER_DNS_DOMAIN="cluster.local." # MASTER API Server 地址 MASTER_URL="k8s-api.virtual.local"
将上面变量保存为: env.sh,而后将脚本拷贝到全部机器的/usr/k8s/bin
目录。网络
注意点: BOOTSTRAP_TOKEN 须要执行head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成app
为方便后面迁移,咱们在集群内定义一个域名用于访问apiserver
,在每一个节点的/etc/hosts
文件中添加记录:192.168.150.128 k8s-api.virtual.local k8s-api
其中192.168.150.128
为master01 的IP,暂时使用该IP 来作apiserver 的负载地址
若是你使用的是阿里云的ECS 服务,强烈建议你先将上述节点的安全组配置成容许全部访问,否则在安装过程当中会遇到各类访问不了的问题,待集群配置成功之后再根据须要添加安全限制。
kubernetes
系统各个组件须要使用TLS
证书对通讯进行加密,这里咱们使用CloudFlare
的PKI 工具集cfssl 来生成Certificate Authority(CA) 证书和密钥文件, CA 是自签名的证书,用来签名后续建立的其余TLS 证书。
$ 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
文件中。
修改上面建立的config.json
文件为ca-config.json
:
$ 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
:
$ 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 证书和私钥:
$ 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
目录下面:
$ sudo mkdir -p /etc/kubernetes/ssl
$ sudo cp ca* /etc/kubernetes/ssl
kubernetes 系统使用etcd
存储全部的数据,咱们这里部署3个节点的etcd 集群,这3个节点直接复用kubernetes master的3个节点,分别命名为etcd01
、etcd02
、etcd03
:
使用到的变量以下:
$ export NODE_NAME=etcd01 # 当前部署的机器名称(随便定义,只要能区分不一样机器便可) $ export NODE_IP=192.168.150.128 # 当前部署的机器IP $ export NODE_IPS="192.168.150.128 192.168.150.130 192.168.150.131" # etcd 集群全部机器 IP $ # etcd 集群间通讯的IP和端口 $ export ETCD_NODES=etcd01=https://192.168.150.128:2380,etcd02=https://192.168.150.130:2380,etcd03=https://192.168.150.131:2380 $ # 导入用到的其它全局变量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR $ source /usr/k8s/bin/env.sh
到https://github.com/coreos/etcd/releases页面下载最新版本的二进制文件:
$ 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/
#目前etcd好像是3.3.9版本了吧
为了保证通讯安全,客户端(如etcdctl)与etcd 集群、etcd 集群之间的通讯须要使用TLS 加密。
建立etcd 证书签名请求:
$ 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
证书和私钥:
$ 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/
$ 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
,须要在启动服务前建立这个目录;--initial-cluster-state
值为new
时,--name
的参数值必须位于--initial-cluster
列表中;$ sudo mv etcd.service /etc/systemd/system/ $ sudo systemctl daemon-reload $ sudo systemctl enable etcd $ sudo systemctl start etcd $ sudo systemctl status etcd
#/etc/systemd/system下面发生改变时须要执行systemctl daemon-reload 命令 从新加载配置
#最早启动的etcd 进程会卡住一段时间,等待其余节点启动加入集群,在全部的etcd 节点重复上面的步骤,直到全部的机器etcd 服务都已经启动。
#须要注意的是 我配置的都没有问题可是启动etcd的时候3个节点都显示链接超时反复排查检查证书文件都是没有问题的,最后想到的是 我这3个master机器是新建的虚拟机
selinux没有关闭,防火墙没有放行端口2080,237九、要是我的实验能够关闭防火墙。
#还有配置完一台的时候启动etcd确定是启动不起来etcd服务的,由于是集群须要全部master节点都配置完etcd还能启动服务成功。
把master01上面/usr/k8s/bin/ 、/etc/kubernetes/ssl 这两个下面的全部文件都要拷贝到master02,master03机器上面对应的目录
给你们看一个节点就好了 3个节点都同样的,看一个就好了 嘿嘿!
接下来验证服务了,就算这3个节点的etcd都显示active也不能保证集群之间能正常通讯因此须要验证一下。
部署完etcd 集群后,在任一etcd 节点上执行下面命令:
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
写了一个for循环测试一下
能够看到上面的信息3个节点上的etcd 均为healthy,则表示集群服务正常。