实践环境准备
服务器说明
我这里使用的是7台CentOS-7.5的虚拟机,具体信息如下表:
系统版本 | IP地址 | 节点角色 | CPU | Memory | Hostname |
CentOS-7.5 | 192.168.3.100 | ansible | 2 | 2 | ansible |
CentOS-7.5 | 192.168.3.101 | master1 | 2 | 2 | master1 |
CentOS-7.5 | 192.168.3.102 | master2 | 2 | 2 | master2 |
CentOS-7.5 | 192.168.3.103 | master3 | 2 | 2 | master3 |
CentOS-7.5 | 192.168.3.105 | node1 | 2 | 2 | node1 |
CentOS-7.5 | 192.168.3.106 | node2 | 2 | 2 | node2 |
CentOS-7.5 | 192.168.3.107 | node3 | 2 | 2 | node3 |
软件版本说明:
- k8s:1.19.0
- etcd:3.4.13
- coredns:1.7.0
- pause:3.2
- calico:3.16.0
- cfssl:1.2.0
- kubernetes dashboard:2.0.3
以下是搭建k8s集群过程中ip、端口等网络相关配置的说明,后续将不再重复解释:
# 3个master节点的ip
192.168.3.101
192.168.3.102
192.168.3.103
# 3个worker节点的ip
192.168.3.105
192.168.3.106
192.168.3.107
# 3个master节点的hostname
master1、master2、master3
# api-server的高可用虚拟ip(keepalived会用到,可自定义)
192.168.3.200
# keepalived用到的网卡接口名,一般是eth0,可执行ip a命令查看
ens32
# kubernetes服务ip网段(可自定义)
10.255.0.0/16
# kubernetes的api-server服务的ip,一般是cidr的第一个(可自定义)
10.255.0.1
# dns服务的ip地址,一般是cidr的第二个(可自定义)
10.255.0.2
# pod网段(可自定义)
172.23.0.0/16
# NodePort的取值范围(可自定义)
8400-8900
系统设置(所有节点)
1、主机名必须每个节点都不一样,并且保证所有点之间可以通过hostname互相访问。设置hostname:
# 查看主机名
$ hostname
# 修改主机名
$ hostnamectl set-hostname <your_hostname>
配置host,使所有节点之间可以通过hostname互相访问:
配置免密登录
由于二进制的搭建方式需要各个节点具备k8s组件的二进制可执行文件,所以我们得将准备好的二进制文件copy到各个节点上。为了方便文件的copy,我们可以选择一个中转节点(随便一个节点),配置好跟其他所有节点的免密登录,这样在copy的时候就不需要反复输入密码了。
批量主机探测秘钥分发脚本
https://www.cnblogs.com/wwp01/p/13830437.html
ansible批量安装依赖包关闭防火墙、swap,重置iptables 系统参数设置:
下载二进制文件
下载Kubernetes
我们首先下载k8s的二进制文件,k8s的官方下载地址如下:
我这里下载的是1.19.0
版本,注意下载链接是在CHANGELOG/CHANGELOG-1.19.md里面:
只需要在“Server Binaries”一栏选择对应的平台架构下载即可,因为Server的压缩包里已经包含了Node和Client的二进制文件:
复制下载链接,到系统上下载并解压:
为了后面copy文件方便,我们需要整理一下文件,将不同节点所需的二进制文件统一放在相同的目录下。具体步骤如下:
mkdir -p k8s-master k8s-worker
cd ~/package
for i in kubeadm kube-apiserver kube-controller-manager kubectl kube-scheduler;do cp $i ~/package/k8s-master/; done
for i in kubelet kube-proxy;do cp $i ~package/k8s-node/; done
整理后的文件都被放在了相应的目录下,k8s-master
目录存放master
所需的二进制文件,k8s-worker
目录则存放了worker
节点所需的文件:
[root@ansible package]# ls k8s-master/
kubeadm kube-apiserver kube-controller-manager kubectl kube-scheduler
[root@ansible package]# ls k8s-node/
kubelet kube-proxy
下载etcd
k8s依赖于etcd做分布式存储,所以接下来我们还需要下载etcd,官方下载地址如下:
我这里下载的是3.4.13
版本:
同样,复制下载链接到系统上使用wget
命令进行下载并解压:
[root@ansible package]# wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
[root@ansible package]# tar -zxvf etcd-v3.3.25-linux-amd64.tar.gz -C etcd --strip-components 1
[root@ansible package]# ls etcd
Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
将etcd的二进制文件拷贝到k8s-master
目录下:
[root@ansible etcd]# cd ~/package/etcd
[root@ansible etcd]# for i in etcd etcdctl ;do cp -r $i ~/package/k8s-master/ ; done
[root@ansible package]# ls k8s-master/
etcd etcdctl kubeadm kube-apiserver kube-controller-manager kubectl kube-scheduler
分发文件并设置好PATH
在所有节点上创建/opt/kubernetes/bin
目录:
[root@ansible package]# ansible all -a "mkdir -pv /opt/kubernetes/bin/"
将二进制文件分发到相应的节点上:
[root@ansible ~]# for i in master1 master2 master3 ;do scp ~/package/k8s-master/* $i:/opt/kubernetes/bin/ ; done
[root@ansible ~]# for i in node1 node2 node3 ;do scp ~/package/k8s-node/* $i:/opt/kubernetes/bin/ ; done
给每个节点设置PATH
环境变量:
ansible all -a "echo 'PATH=/opt/kubernetes/bin:$PATH' >> ~/.bashrc"
高可用集群部署
生成CA证书(任意节点)
安装cfssl
cfssl
是非常好用的CA工具,我们用它来生成证书和秘钥文件。安装过程比较简单,我这里选择在m1
节点上安装。首先下载cfssl
的二进制文件:
[root@ansible ~]# mkdir -p ~/bin
[root@ansible ~]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O ~/bin/cfssl
[root@ansible ~]#wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O ~/bin/cfssljson
将这两个文件授予可执行的权限:
[root@ansible ~]#chmod +x ~/bin/cfssl ~/bin/cfssljson
设置一下PATH
环境变量:
[root@ansible ~]# vim ~/.bashrc
PATH=~/bin:$PATH
[root@ansible ~]#source ~/.bashrc
验证一下是否能正常执行:
[root@ansible ~]# cfssl version
Version: 1.2.0
Revision: dev
Runtime: go1.6
生成根证书
根证书是集群所有节点共享的,所以只需要创建一个 CA 证书,后续创建的所有证书都由它签名。首先创建一个ca-csr.json
文件,内容如下:
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "seven"
}
]
}
执行以下命令,生成证书和私钥
[root@ansible bin]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
生成完成后会有以下文件(我们最终想要的就是ca-key.pem
和ca.pem
,一个秘钥,一个证书):
[root@ansible bin]# ls *pem
ca-key.pem ca.pem
将这两个文件分发到每个master
节点上:
[root@ansible ~]# ansible master -a "mkdir -p /etc/kubernetes/pki/"
[root@ansible ~]# ansible master -m copy -a "src=~/bin/ca.pem dest=/etc/kubernetes/pki/"
[root@ansible bin]# ansible master -m copy -a "src=~/bin/ca-key.pem dest=/etc/kubernetes/pki/"
部署etcd集群(master节点)
生成证书和私钥
接下来我们需要生成etcd节点使用的证书和私钥,创建ca-config.json
文件,内容如下,
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
然后创建etcd-csr.json
文件,内容如下:
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"192.168.243.143",
"192.168.243.144",
"192.168.243.145"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "seven"
}
]
}
hosts
里的ip是master
节点的ip
有了以上两个文件以后就可以使用如下命令生成etcd的证书和私钥
[root@ansible bin]# cfssl gencert -ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd
[root@ansible bin]# ls etcd*.pem # 执行成功会生成两个文件
etcd-key.pem etcd.pem
然后将这两个文件分发到每个etcd节点:
---
- hosts: master
remote_user: root
tasks:
- name:
copy:
src: ~/bin/{{item}}
dest: /etc/kubernetes/pki/
with_items:
['etcd-key.pem','etcd.pem']
创建service文件
创建etcd.service
文件,用于后续可以通过systemctl
命令去启动、停止及重启etcd服务,内容如下:
[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/kubernetes/bin/etcd \
--data-dir=/var/lib/etcd \
--name=m1 \
--cert-file=/etc/kubernetes/pki/etcd.pem \
--key-file=/etc/kubernetes/pki/etcd-key.pem \
--trusted-ca-file=/etc/kubernetes/pki/ca.pem \
--peer-cert-file=/etc/kubernetes/pki/etcd.pem \
--peer-key-file=/etc/kubernetes/pki/etcd-key.pem \
--peer-trusted-ca-file=/etc/kubernetes/pki/ca.pem \
--peer-client-cert-auth \
--client-cert-auth \
--listen-peer-urls=https://192.168.3.101:2380 \
--initial-advertise-peer-urls=https://192.168.3.101:2380 \
--listen-client-urls=https://192.168.3.101:2379,http://127.0.0.1:2379 \
--advertise-client-urls=https://192.168.3.101:2379 \
--initial-cluster-token=etcd-cluster-0 \
--initial-cluster=m1=https://192.168.3.101:2380,m2=https://192.168.3.102:2380,m3=https://192.168.3.103:2380 \
--initial-cluster-state=new
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
将该配置文件分发到每个master
节点:
[root@ansible k8s-master]# ansible master -m copy -a "src=~/package/k8s-master/etcd.service dest=/etc/systemd/system/"
分发完之后,需要在除了m1
以外的其他master
节点上修改etcd.service
文件的内容,主要修改如下几处:
# 修改为所在节点的hostname
--name=m1
# 以下几项则是将ip修改为所在节点的ip,本地ip不用修改
--listen-peer-urls=https://192.168.3.101:2380
--initial-advertise-peer-urls=https://192.168.3.101:2380
--listen-client-urls=https://192.168.3.101:2379,http://127.0.0.1:2379
--advertise-client-urls=https://192.168.3.101:2379
接着在每个master
节点上创建etcd的工作目录:
ansible master -a "mkdir -p /var/lib/etcd"
启动服务