實踐環境准備
服務器說明
我這里使用的是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"
啟動服務
在各個etcd節點上執行如下命令啟動etcd服務: