kubeadm搭建多master節(jié)點(diǎn)的K8S高可用集群

部署一套完整的企業(yè)級(jí)K8s集群

一真友、準(zhǔn)備環(huán)境

服務(wù)器要求:

? 建議最小硬件配置:4核CPU盔然、4G內(nèi)存、50G硬盤

? 服務(wù)器最好可以訪問外網(wǎng)挺尾,會(huì)有從網(wǎng)上拉取鏡像需求遭铺,如果服務(wù)器不能上網(wǎng)恢准,需要提前下載對(duì)應(yīng)鏡像并導(dǎo)入節(jié)點(diǎn)

軟件環(huán)境:

軟件 版本

操作系統(tǒng) CentOS7.8_x64

Docker 19+

Kubernetes 1.20

服務(wù)器整體規(guī)劃:

角色 IP 其他單裝組件

k8s-master1 192.168.172.40 docker馁筐,etcd敏沉,nginx,keepalived

k8s-master2 192.168.172.41 docker舱卡,etcd轮锥,nginx要尔,keepalived

k8s-master3 192.168.172.42 docker赵辕,etcd还惠,nginx,keepalived

k8s-node1 192.168.172.43 docker

負(fù)載均衡器對(duì)外IP 192.168.172.199 (VIP) ?

架構(gòu)圖:

操作系統(tǒng)初始化配置:

# 關(guān)閉防火墻

systemctl stop firewalld

systemctl disable firewalld

# 關(guān)閉selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config? # 永久

setenforce 0? # 臨時(shí)

# 關(guān)閉swap

swapoff -a? # 臨時(shí)

sed -ri 's/.*swap.*/#&/' /etc/fstab? ? # 永久

# 根據(jù)規(guī)劃設(shè)置主機(jī)名

hostnamectl set-hostname <hostname>

# 在master添加hosts

cat >> /etc/hosts << EOF

192.168.172.40 k8s-master1

192.168.172.41 k8s-master2

192.168.172.42 k8s-master3

192.168.172.43 k8s-node1

EOF

# 將橋接的IPv4流量傳遞到iptables的鏈

cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

sysctl --system? # 生效

# 時(shí)間同步

yum install ntpdate -y

ntpdate time.windows.com

二、部署Nginx+Keepalived高可用負(fù)載均衡器

2.1安裝軟件包(主/備)

yum install epel-release -y

yum install nginx keepalived -y

2.2 Nginx配置文件(主/備一樣)

user nginx;

worker_processes auto;

error_log /var/log/nginx/error.log;

pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {

? ? worker_connections 1024;

}

# 四層負(fù)載均衡笆怠,為兩臺(tái)Master apiserver組件提供負(fù)載均衡

stream {

? ? log_format? main? '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';

? ? access_log? /var/log/nginx/k8s-access.log? main;

? ? upstream k8s-apiserver {

? ? ? server 192.168.172.40:6443;? # Master1 APISERVER IP:PORT

? ? ? server 192.168.172.41:6443;? # Master2 APISERVER IP:PORT

? ? }


? ? server {

? ? ? listen 16443; # 由于nginx與master節(jié)點(diǎn)復(fù)用蹬刷,這個(gè)監(jiān)聽端口不能是6443办成,否則會(huì)沖突

? ? ? proxy_pass k8s-apiserver;

? ? }

}

http {

? ? log_format? main? '$remote_addr - $remote_user [$time_local] "$request" '

? ? ? ? ? ? ? ? ? ? ? '$status $body_bytes_sent "$http_referer" '

? ? ? ? ? ? ? ? ? ? ? '"$http_user_agent" "$http_x_forwarded_for"';

? ? access_log? /var/log/nginx/access.log? main;

? ? sendfile? ? ? ? ? ? on;

? ? tcp_nopush? ? ? ? ? on;

? ? tcp_nodelay? ? ? ? on;

? ? keepalive_timeout? 65;

? ? types_hash_max_size 2048;

? ? include? ? ? ? ? ? /etc/nginx/mime.types;

? ? default_type? ? ? ? application/octet-stream;

? ? server {

? ? ? ? listen? ? ? 80 default_server;

? ? ? ? server_name? _;

? ? ? ? location / {


? ? ? ? }

? ? }

}


2.3 keepalived配置文件(Nginx Master)

vi /etc/keepalived/keepalived.conf

global_defs {

? notification_email {

? ? acassen@firewall.loc

? ? failover@firewall.loc

? ? sysadmin@firewall.loc

? }

? notification_email_from Alexandre.Cassen@firewall.loc?

? smtp_server 127.0.0.1

? smtp_connect_timeout 30

? router_id NGINX_MASTER

}

vrrp_script check_nginx {

? ? script "/etc/keepalived/check_nginx.sh"

}

vrrp_instance VI_1 {

? ? state MASTER

? ? interface ens33? # 修改為實(shí)際網(wǎng)卡名

? ? virtual_router_id 51 # VRRP 路由 ID實(shí)例诈火,每個(gè)實(shí)例是唯一的

? ? priority 100? ? # 優(yōu)先級(jí)冷守,備服務(wù)器設(shè)置 90

? ? advert_int 1? ? # 指定VRRP 心跳包通告間隔時(shí)間拍摇,默認(rèn)1秒

? ? authentication {

? ? ? ? auth_type PASS? ? ?

? ? ? ? auth_pass 1111

? ? }?

? ? # 虛擬IP

? ? virtual_ipaddress {

? ? ? ? 192.168.172.199/24

? ? }

? ? track_script {

? ? ? ? check_nginx

? ? }

}

準(zhǔn)備上述配置文件中檢查nginx運(yùn)行狀態(tài)的腳本:

cat > /etc/keepalived/check_nginx.sh? << "EOF"

#!/bin/bash

count=$(ss -antp |grep 16443 |egrep -cv "grep|$$")

if [ "$count" -eq 0 ];then

?? exit 1

else

?? exit 0

fi

EOF

賦權(quán)限:

chmod +x /etc/keepalived/check_nginx.sh

準(zhǔn)備上述配置文件中檢查nginx運(yùn)行狀態(tài)的腳本:

cat > /etc/keepalived/check_nginx.sh? << "EOF"

cat > /etc/keepalived/check_nginx.sh << "EOF"

#!/bin/bash

count=$(ss -antp |grep 16443 |egrep -cv "grep|$$")

if [ "$count" -eq 0 ];then

?? exit 1

else

?? exit 0

fi

EOF

chmod +x /etc/keepalived/check_nginx.sh

systemctl daemon-reload

systemctl start nginx ; systemctl enable nginx

systemctl status nginx

systemctl start keepalived ; systemctl enable keepalived

systemctl status keepalived


ip addr 查看一下vip地址

每臺(tái)導(dǎo)入離線的docker 鏡像
docker load -i k8s-images-v1.20.4.tar.gz

gzip -dc k8s-images-v1.20.4.tar.gz? |ssh root@主機(jī)名'cat |?docker load'

第一臺(tái)master創(chuàng)建kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta2

kind: ClusterConfiguration

kubernetesVersion: v1.20.4

controlPlaneEndpoint: 192.168.172.199:16443

imageRepository: registry.aliyuncs.com/google_containers

apiServer:

certSANs:

- 192.168.172.140

- 192.168.172.141

- 192.168.172.142

- 192.168.172.143

- 192.168.172.199

networking:

? podSubnet: 10.244.0.0/16

? serviceSubnet: 10.10.0.0/16

---

apiVersion: kubeproxy.config.k8s.io/v1alpha1

kind: KubeProxyConfiguration

mode: ipvs


使用kubeadm初始化k8s集群

?kubeadm init --config kubeadm-config.yaml

注:--image-repository registry.aliyuncs.com/google_containers為保證拉取鏡像不到國外站點(diǎn)拉取蜂莉,手動(dòng)指定倉庫地址為registry.aliyuncs.com/google_containers映穗。kubeadm默認(rèn)從k8ss.grc.io拉取鏡像蚁滋。

出現(xiàn) 下面兩段赘淮,有--control-plane到主節(jié)點(diǎn)敲梢卸,另外個(gè)是工作節(jié)點(diǎn)

kubeadm join 192.168.172.199:16443 --token 4thpb5.jbwmftjg9rmxkbw3 \

? ? --discovery-token-ca-cert-hash sha256:85cf38fda29840a592102e676f9b491895b22e458de404f0401f3da58fc44eeb \

? ? --control-plane

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.172.199:16443 --token 4thpb5.jbwmftjg9rmxkbw3 \

? ? --discovery-token-ca-cert-hash sha256:85cf38fda29840a592102e676f9b491895b22e458de404f0401f3da58fc44eeb

配置kubectl的配置文件蛤高,保存一個(gè)證書,這樣kubectl命令可以使用這個(gè)證書對(duì)k8s集群進(jìn)行管理

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看節(jié)點(diǎn)是否正常姻锁,這時(shí)候只有一臺(tái)

kubectl get nodes

NAME? ? ? STATUS? ? ROLES? ? ? ? ? ? ? ? ? AGE? VERSION

主機(jī)名? ? ?NotReady? control-plane,master? 60s? v1.20.4

此時(shí)集群狀態(tài)還是NotReady狀態(tài),因?yàn)榫W(wǎng)絡(luò)組件沒有啟動(dòng)开皿。

#把第一臺(tái)master節(jié)點(diǎn)的證書拷貝到其他兩臺(tái)上

cd /root && mkdir -p /etc/kubernetes/pki/etcd &&mkdir -p ~/.kube/

?scp /etc/kubernetes/pki/ca.crt 主機(jī)名:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/ca.key?主機(jī)名:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.key 主機(jī)名:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.pub 主機(jī)名:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.crt 主機(jī)名:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.key 主機(jī)名:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/etcd/ca.crt 主機(jī)名:/etc/kubernetes/pki/etcd/

scp /etc/kubernetes/pki/etcd/ca.key 主機(jī)名:/etc/kubernetes/pki/etcd/

證書拷貝后赋荆,master上執(zhí)行如下命令,每個(gè)人不一樣

kubeadm join 192.168.172.199:16443 --token 4thpb5.jbwmftjg9rmxkbw3 \

? ? --discovery-token-ca-cert-hash sha256:85cf38fda29840a592102e676f9b491895b22e458de404f0401f3da58fc44eeb \

? ? --control-plane


node節(jié)點(diǎn)執(zhí)行

kubeadm join 192.168.172.199:16443 --token 4thpb5.jbwmftjg9rmxkbw3 \

? ? --discovery-token-ca-cert-hash sha256:85cf38fda29840a592102e676f9b491895b22e458de404f0401f3da58fc44eeb

查看集群情況? kubectl get nodes

NAME? ? ? STATUS? ? ROLES? ? ? ? ? ? ? ? ? AGE? VERSION

master1? ?NotReady? control-plane,master? 19m? ? ?v1.20.4

master2???NotReady? control-plane,master? 6m22s? v1.20.4

master3???NotReady? control-plane,master? 2m29s? v1.20.4

node1? ? ? ?NotReady? ? ? ? ? 78s? ? v1.20.4

上面狀態(tài)都是notready狀態(tài),說明沒有安裝網(wǎng)絡(luò)插件

Calico簡介

Calico 是一種容器之間互通的網(wǎng)絡(luò)方案月帝。在虛擬化平臺(tái)中幽污,比如OpenStack距误、Docker 等都需要實(shí)現(xiàn)主機(jī)之間互連,但同時(shí)也需要對(duì)容器做隔離控制趁俊。而在多數(shù)的虛擬化平臺(tái)實(shí)現(xiàn)中则酝,通常都使用二層隔離技術(shù)來實(shí)現(xiàn)容器的網(wǎng)絡(luò)闰集,這些二層的技術(shù)有一些弊端武鲁,比如需要依賴VLAN、bridge 和隧道等技術(shù)挚瘟,其中bridge 帶來了復(fù)雜性乘盖,vlan 隔離和tunnel 隧道在拆包或加包頭時(shí)憔涉,則消耗更多的資源并對(duì)物理環(huán)境也有要求兜叨。隨著網(wǎng)絡(luò)規(guī)模的增大衩侥,整體會(huì)變得越加復(fù)雜茫死。

Calico把Host 當(dāng)作Internet 中的路由器峦萎,使用BGP 同步路由忆首,并使用iptables 來做安全訪問策略雄卷。

設(shè)計(jì)思想:Calico 不使用隧道或NAT 來實(shí)現(xiàn)轉(zhuǎn)發(fā),而是巧妙的把所有二三層流量轉(zhuǎn)換成三層流量妒潭,并通過host 上路由配置完成跨Host 轉(zhuǎn)發(fā)

常見的網(wǎng)絡(luò)插件對(duì)比分析

flannel:支持地址分配雳灾,不支持網(wǎng)絡(luò)策略谎亩。

calico:支持地址分配宇姚,支持網(wǎng)絡(luò)策略浑劳。

flannel:

支持多種后端:

VxLAN:

(1) vxlan 疊加網(wǎng)絡(luò)模式

(2) Directrouting?

host-gw: Host Gateway 直接路由模式

UDP:一般不用這個(gè)模式

安裝Calico網(wǎng)絡(luò)組件

kubectl apply -f calico.yaml

注:在線下載配置文件地址是:https://docs.projectcalico.org/manifests/calico.yaml

拉取鏡像需要一定時(shí)間魔熏,所以我們查看pod狀態(tài)為running則安裝成功。

kubectl get pod --all-namespaces

最后看一下集群狀態(tài)
kubectl get nodes

NAME? ? ? STATUS? ROLES? ? ? ? ? ? ? ? ? AGE? VERSION

master1? ?Ready? ? control-plane,master? 22h? v1.20.4

master2??Ready? ? control-plane,master? 22h? v1.20.4

master3? ?Ready? ? control-plane,master? 22h? v1.20.4

node1? ? ? Ready? ? <none>? ? ? ? ? ? ? ? 22h? v1.20.4



測試在k8s創(chuàng)建pod是否可以正常訪問網(wǎng)絡(luò)?

kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh

If you don't see a command prompt, try pressing enter.

/ # ping www.qq.com

PING www.qq.com (183.194.238.19): 56 data bytes

64 bytes from 183.194.238.19: seq=0 ttl=127 time=11.423 ms

64 bytes from 183.194.238.19: seq=1 ttl=127 time=11.267 ms

^C

ping www.qq.com 能正常訪問即成功

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躲雅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子此蜈,更是在濱河造成了極大的恐慌裆赵,老刑警劉巖跺嗽,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植兰,死亡現(xiàn)場離奇詭異璃吧,居然都是意外死亡畜挨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呕缭,“玉大人修己,你說我怎么就攤上這事睬愤。” “怎么了滋戳?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵奸鸯,是天一觀的道長娄涩。 經(jīng)常有香客問我,道長扬虚,這世上最難降的妖魔是什么辜昵? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任堪置,我火速辦了婚禮,結(jié)果婚禮上张惹,老公的妹妹穿的比我還像新娘舀锨。我一直安慰自己,他們只是感情好宛逗,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布坎匿。 她就那樣靜靜地躺著,像睡著了一般雷激。 火紅的嫁衣襯著肌膚如雪替蔬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天侥锦,我揣著相機(jī)與錄音,去河邊找鬼恭垦。 笑死快毛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的番挺。 我是一名探鬼主播唠帝,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼玄柏!你這毒婦竟也來了襟衰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤粪摘,失蹤者是張志新(化名)和其女友劉穎瀑晒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徘意,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苔悦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椎咧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玖详。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蟋座,到底是詐尸還是另有隱情拗踢,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布向臀,位于F島的核電站巢墅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏飒硅。R本人自食惡果不足惜砂缩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一作谚、第九天 我趴在偏房一處隱蔽的房頂上張望三娩。 院中可真熱鬧,春花似錦妹懒、人聲如沸雀监。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽会前。三九已至,卻和暖如春匾竿,著一層夾襖步出監(jiān)牢的瞬間瓦宜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工岭妖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留临庇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓昵慌,卻偏偏與公主長得像假夺,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斋攀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容