实践环境准备

服务器说明

我这里使用的是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互相访问:

ansible client_json

配置免密登录

由于二进制的搭建方式需要各个节点具备k8s组件的二进制可执行文件,所以我们得将准备好的二进制文件copy到各个节点上。为了方便文件的copy,我们可以选择一个中转节点(随便一个节点),配置好跟其他所有节点的免密登录,这样在copy的时候就不需要反复输入密码了。

 

批量主机探测秘钥分发脚本

https://www.cnblogs.com/wwp01/p/13830437.html

 

ansible批量安装依赖包关闭防火墙、swap,重置iptables 系统参数设置:

ansible client_二进制文件_02

下载二进制文件

下载Kubernetes

我们首先下载k8s的二进制文件,k8s的官方下载地址如下:

我这里下载的是1.19.0版本,注意下载链接是在CHANGELOG/CHANGELOG-1.19.md里面:

ansible client_ansible client_03

 

 

只需要在“Server Binaries”一栏选择对应的平台架构下载即可,因为Server的压缩包里已经包含了Node和Client的二进制文件:

 

ansible client_ansible client_04

 

 复制下载链接,到系统上下载并解压:

ansible client_CentOS_05

 

为了后面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版本:

ansible client_ansible client_06

 

 同样,复制下载链接到系统上使用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.pemca.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"

启动服务