部署一套完整的企業(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 能正常訪問即成功