ansible部署二进制包k8s


实践环境准备

服务器说明

我这里使用的是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.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"

启动服务

在各个etcd节点上执行如下命令启动etcd服务:

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM