一步一步搭建kubernetes
背景
在裸辞后折腾了两个月终于找到了一个像样的工作,在进入公司后安排我去做和kubernetes相关的工作。之前docker接触的都很少,所以从使用二进制文件搭建kubernetes环境进行入门学习。
需要的环境
- 三台虚拟机(已配置静态ip),可访问外网。
- centos7
开始搭建之旅
准备搭建kubernetes环境中的所有二进制文件
我已经将本次需要的二进制文件都已经打包下载了本地,需要copy的我的三太虚拟机中。在这个之前我先使用如下命令:
hostnamectl set-hostname master
将三台虚拟机hostname分别设置为master
,node1
,node2
。在后期我们将通过master对node1,node2节点进行操作完成镜像的部署。
使用fstp
命令将准备好的压缩包copy到虚拟机:
sftp local-master-root123456
sftp后面是跟的我虚拟机的地址,但是我在.ssh下的config文件中做了如下的配置可以使用table键快速的补全
Host local-master-root123456
HostName 192.168.0.110
User root
Port 22
Host local-node1-root123456
HostName 192.168.0.111
User root
Port 22
Host local-node2-root123456
HostName 192.168.0.112
User root
Port 22
将准备好的压缩文件bin-k8s-164.tar.gz使用sftp上传到三台虚拟中并解压,解压出来的bin文件下就是这次环境搭建所需要的所有工具。解压后将bin文件放在/opt/k8s路径下。
准备环境变量
vi /etc/profile
添加如下环境变量
##k8s SETTING
# 生成 EncryptionConfig 所需的加密 key
export BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c"
# 最好使用 当前未用的网段 来定义服务网段和 Pod 网段
# 服务网段,部署前路由不可达,部署后集群内路由可达(kube-proxy 和 ipvs 保证)
export SERVICE_CIDR="10.254.0.0/16"
# Pod 网段,建议 /16 段地址,部署前路由不可达,部署后集群内路由可达(flanneld 保证)
export CLUSTER_CIDR="172.30.0.0/16"
# 服务端口范围 (NodePort Range)
export NODE_PORT_RANGE="8400-9000"
# 集群各机器 IP 数组
export NODE_IPS="172.168.0.110 172.168.0.111 172.168.0.112"
export NODE_NAME=master
export NODE_IP=172.168.0.110
# 集群各 IP 对应的 主机名数组
export NODE_NAMES="master node1 node2"
# kube-apiserver 的 VIP(HA 组件 keepalived 发布的
export MASTER_VIP=172.168.0.110
# kube-apiserver VIP 地址(HA 组件 haproxy 监听 8443 端口)
export KUBE_APISERVER="https://${MASTER_VIP}:8443"
# HA 节点,配置 VIP 的网络接口名称
export VIP_IF="eth0"
# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://172.168.0.110:2379,https://172.168.0.111:2379,https://172.168.0.112:2379"
# etcd 集群间通信的 IP 和端口
export ETCD_NODES="master=https://172.168.0.110:2380,node1=https://172.168.0.111:2380,node2=https://172.168.0.112:2380"
# flanneld 网络配置前缀
export FLANNEL_ETCD_PREFIX="/kubernetes/network"
# kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"
# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
export CLUSTER_DNS_SVC_IP="10.254.0.2"
# 集群 DNS 域名
export CLUSTER_DNS_DOMAIN="cluster.local."
# 将二进制目录 /opt/k8s/bin 加到 PATH 中
export PATH=/opt/k8s/bin:$PATH
再添加了环境变量后也不要忘记
source /etc/profile
使环境变量生效,其中NODE_NAME,NODE_IP要根据不同的节点配置相应的内容
开始安装kubernetes所需插件
- 创建CA证书和密钥
kubernetes
系统各组件需要使用 TLS
证书对通信进行加密,本文档使用 CloudFlare
的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 证书和秘钥文件,CA 是自签名的证书,用来签名后续创建的其它 TLS 证书。
cfssl
工具已经在/opt/k8s/bin目录下我们无需再进行安装。
在master上分别生成CA证书和密钥
[root@master ~]# mkdir ssl
[root@master ~]# cd ssl
[root@master ~]# cfssl print-defaults config > config.json
[root@master ~]# cfssl print-defaults csr > csr.json
生成如下文件
[root@master ~]# cd ssl/
[root@master ssl]# ls
config.json csr.json
创建CA配置文件
[root@master ssl]# vi ca-config.json
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
signing
:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth
:表示 client 可以用该 CA 对 server 提供的证书进行验证;
client auth
:表示 server 可以用该 CA 对 client 提供的证书进行验证
创建 CA 证书签名请求:
[root@master ssl]# vi ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
CN
:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
O
:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
生成 CA 证书和私钥:
[root@master ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
2018/11/16 03:59:26 [INFO] generating a new CA key and certificate from CSR
2018/11/16 03:59:26 [INFO] generate received request
2018/11/16 03:59:26 [INFO] received CSR
2018/11/16 03:59:26 [INFO] generating key: rsa-2048
2018/11/16 03:59:26 [INFO] encoded CSR
2018/11/16 03:59:26 [INFO] signed certificate with serial number 42633968990372506030174847640209844733625069020
[root@master ssl]# ll
总用量 28
-rw-r--r--. 1 root root 290 11月 16 03:48 ca-config.json
-rw-r--r--. 1 root root 1001 11月 16 03:59 ca.csr
-rw-r--r--. 1 root root 208 11月 16 03:50 ca-csr.json
-rw-------. 1 root root 1679 11月 16 03:59 ca-key.pem
-rw-r--r--. 1 root root 1359 11月 16 03:59 ca.pem
-rw-r--r--. 1 root root 567 11月 16 03:31 config.json
-rw-r--r--. 1 root root 287 11月 16 03:31 csr.json
将生成的 CA 证书、秘钥文件、配置文件拷贝到所有机器的 /etc/kubernetes/ssl
目录下
[root@master ssl]# sudo mkdir -p /etc/kubernetes/ssl
[root@master ssl]# cp ca* /etc/kubernetes/ssl
颁发证书你需要将证书和密钥文件copy到node1和node2节点上机器上。
[root@master ~]# sftp root@192.168.0.111
The authenticity of host '192.168.0.111 (192.168.0.111)' can't be established.
ECDSA key fingerprint is SHA256:A8ry0oU6CfNAmQm0AC5BkiHy/47N9moAAmoFRF4cPKg.
ECDSA key fingerprint is MD5:c3:b3:cf:d0:3c:22:ea:d7:8b:a6:60:71:fe:1e:3d:73.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.111' (ECDSA) to the list of known hosts.
root@192.168.0.111's password:
Connected to 192.168.0.111.
sftp> lls
anaconda-ks.cfg bin bin-k8s-164.tar.gz ssl
sftp> put -r ssl
Uploading ssl/ to /root/ssl
Entering ssl/
ssl/config.json 100% 567 335.2KB/s 00:00
ssl/csr.json 100% 287 192.1KB/s 00:00
ssl/ca-config.json 100% 290 171.1KB/s 00:00
ssl/ca-csr.json 100% 208 117.4KB/s 00:00
ssl/ca.pem 100% 1359 740.5KB/s 00:00
ssl/ca-key.pem 100% 1679 853.2KB/s 00:00
ssl/ca.csr 100% 1001 582.6KB/s 00:00
sftp>
- 部署高可用的etcd集群
kuberntes 系统使用 etcd 存储所有数据,本文档介绍部署一个三节点高可用 etcd 集群,etcd的二进制文件已经在/opt/k8s/bin下
创建TLS 秘钥和证书:
先创建一个临时目录来存放生成的证书
[root@master ~]# mkdir temp
[root@master ~]# ls
anaconda-ks.cfg bin bin-k8s-164.tar.gz ssl temp
创建 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 证书和私钥:
[root@master temp]# 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
2018/11/16 05:18:11 [INFO] generate received request
2018/11/16 05:18:11 [INFO] received CSR
2018/11/16 05:18:11 [INFO] generating key: rsa-2048
2018/11/16 05:18:11 [INFO] encoded CSR
2018/11/16 05:18:11 [INFO] signed certificate with serial number 19240619242020143105085287569354169702928195310
2018/11/16 05:18:11 [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@master temp]# ls
etcd.csr etcd-csr.json etcd-key.pem etcd.pem
将证书和私钥放在/etc/etcd/ssl
目录下
[root@master temp]# mkdir -p /etc/etcd/ssl
[root@master temp]# mv etcd*.pem /etc/etcd/ssl
[root@master temp]# ls /etc/etcd/ssl/
etcd-key.pem etcd.pem
[root@master temp]# ls
etcd.csr etcd-csr.json
[root@master temp]# rm -f etcd*
创建 etcd 的 systemd unit 文件, 我们将使用systemctl来启动etcd这个服务:
创建etcd的工作目录:
[root@master temp]# 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=/opt/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 的公私钥(cert-file和key-file)、Peers 通信的公私钥和 CA 证书(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客户端的CA证书(trusted-ca-file);
启动服务etcd服务
[root@master temp]# mv etcd.service /etc/systemd/system/
[root@master temp]# systemctl daemon-reload
[root@master temp]# systemctl enable etcd
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /etc/systemd/system/etcd.service.
完成node节点配置后再启动服务:
systemctl start etcd