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