您好,登錄后才能下訂單哦!
集群規(guī)劃
主機名 | ip | 角色 | 組件 |
---|---|---|---|
master1-3 | 192.168.14.138-140 | master+etcd | etcd kube-apiserver kube-controller-manager kubectl kubeadm kubelet kube-proxy flannel |
worker1 | 192.168.14.141 | node | kubectl kubeadm kubelet kube-proxy flannel |
vip | 192.168.14.142 | 實現(xiàn)apiserver的高可用 |
組件版本
組件 | 版本 |
---|---|
centos | 7.3.1611 |
kernel | 3.10.0-957.el7.x86_64 |
kubeadm | v1.14.3 |
kubelet | v1.14.3 |
kubectl | v1.14.3 |
kube-proxy | v1.14.3 |
flannel | v0.11.0 |
etcd | 3.3.10 |
docker | 18.09.5 |
kubernetes-dashboard | v1.10.1 |
keepalived | 1.3.5 |
haproxy | 1.5.18 |
高可用架構(gòu)說明
kubernetes架構(gòu)概念
kube-apiserver:集群核心,集群API接口、集群各個組件通信的中樞;集群安全控制;
etcd:集群的數(shù)據(jù)中心,用于存放集群的配置以及狀態(tài)信息,通過RAFT同步信息。
kube-scheduler:集群Pod的調(diào)度中心;默認kubeadm安裝情況下–leader-elect參數(shù)已經(jīng)設(shè)置為true,保證master集群中只有一個kube-scheduler處于活躍狀態(tài);
kube-controller-manager:集群狀態(tài)管理器,當集群狀態(tài)與期望不同時,kcm會努力讓集群恢復(fù)期望狀態(tài),比如:當一個pod死掉,kcm會努力新建一個pod來恢復(fù)對應(yīng)replicas set期望的狀態(tài);默認kubeadm安裝情況下–leader-elect參數(shù)已經(jīng)設(shè)置為true,保證master集群中只有一個kube-controller-manager處于活躍狀態(tài);
kubelet: kubernetes node上的 agent,負責與node上的docker engine打交道;
kube-proxy: 每個node上一個,負責service vip到endpoint pod的流量轉(zhuǎn)發(fā),原理是通過設(shè)置iptables規(guī)則實現(xiàn)
負載均衡說明
haproxy: 主要用于apiserver負載均衡
keepalived: 主要用于apiserver高可用。haproxy+keepalived
主要功能就是實現(xiàn)高可用狀態(tài)的負載均衡。首先通過keepalived生成一個虛地址VIP(主機點宕機后漂移到其他機器,VIP在哪臺機器上,就和本地ip地址一樣,都代表本機,共用同網(wǎng)卡,共用本地服務(wù)service,本地接口socket),然后當訪問VIP:PORT再通過haproxy負載至后端的實際端口RIP:6443,即真正的apiserver服務(wù).
準備工作
1、安裝docker
? 參考
2、修改內(nèi)核參數(shù)
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF
sysctl --system
3、關(guān)閉Swap
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
setenforce 0
4、開啟ipvs
需要開啟的模塊是
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
檢查有沒有開啟
cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4
沒有的話,使用以下命令加載
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
5、禁用selinux,關(guān)閉防火墻
關(guān)閉selinux
setenforce 0
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
關(guān)閉防火墻
systemctl stop firewall.service
systemctl disable firewall.service
6、開啟免密,檢查網(wǎng)絡(luò),dns,hosts,ntp是否正常
開啟免密
[master1]ssh-kengen
[master1]ssh-copy-id root@hosts
編輯hosts
vim /etc/hosts
開啟ntp同步
systemctl start ntpd.service
systemctl enable ntpd.service
安裝步驟
一、安裝haproxy和keepalived來創(chuàng)建一個負載均衡器。
1、安裝haproxy
分發(fā)安裝haproxy(所有master節(jié)點)
for i in master1 master2 master3; do ssh root@$i "yum install haproxy ";done
配置haproxy文件(所有master節(jié)點)
cat <EOF > /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode tcp
log global
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
frontend kubernetes
bind *:8443 #配置端口為8443
mode tcp
default_backend kubernetes-master
backend kubernetes-master #后端服務(wù)器,也就是說訪問192.168.255.140:8443會將請求轉(zhuǎn)發(fā)到后端的三臺,這樣就實現(xiàn)了負載均衡
balance roundrobin
server master1 192.168.14.138:6443 check maxconn 2000
server master2 192.168.14.139:6443 check maxconn 2000
server master3 192.168.14.140:6443 check maxconn 2000
EOF
分發(fā)配置文件
for i in master1 master2 master3; do scp /etc/haproxy/haproxy.cfg root@$i:/etc/haproxy/haproxy.cfg;done
重啟服務(wù)器
systemctl daemon-reload && systemctl restart haproxy && systemctl haproxy
2、安裝keepalived
分發(fā)安裝haproxy(所有master節(jié)點)
for i in master1 master2 master3; do ssh root@$i "yum install keepalived ";done
配置keepalived文件(所有master節(jié)點)
cat <EOF > /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #表示發(fā)送通知郵件時郵件源地址是誰
smtp_server 192.168.200.1 #表示發(fā)送email時使用的smtp服務(wù)器地址
smtp_connect_timeout 30 #連接smtp連接超時時間
router_id LVS_docker1 #主機標識,每臺機器上修改
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #備服務(wù)器上改為BACKUP
interface ens160 #改為自己的接口
virtual_router_id 51 # VRID 不可更改
priority 100 #備服務(wù)器上改為小于100的數(shù)字,90,80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.14.142 #虛擬vip,自己設(shè)定
}
}
EOF
keepalived配置不太一樣,要求修改后分發(fā)。
重啟服務(wù)器
systemctl daemon-reload && systemctl restart keepalived && systemctl keepalived
3、驗證keepalived是否正常工作。
登錄主節(jié)點
ip a
二、安裝 kubeadm, kubelet 和 kubectl
1、添加國內(nèi)yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2、指定版本安裝
更新倉庫
yum makecache fast
查找相應(yīng)版本軟件
yum search --showduplicates kubeadm
3、在所有安裝kubelet的節(jié)點上,將kubelet設(shè)置為開機啟動
yum install -y kubectl-1.14.3 kubeadm-1.14.3 kubelet-1.14.3
systemctl daemon-reload && systemctl restart kubelet && systemctl kubelet
四、提前下載所有需要用到的鏡像(谷歌鏡像,通過代理下載)
1、查看需要下載的鏡像
kubeadm config images list
2、通過代理轉(zhuǎn)換鏡像(命令行直接輸入)(所有節(jié)點)
for i in kube-apiserver:v1.14.3 kube-controller-manager:v1.14.3 kube-scheduler:v1.14.3 kube-proxy:v1.14.3 pause:3.1 etcd:3.3.10 coredns:1.3.1 ;do docker pull gcr.akscn.io/google_containers/$i ;docker tag gcr.akscn.io/google_containers/$i k8s.gcr.io/$i; done
國內(nèi)鏡像參考
https://kubernetes.feisky.xyz/fu-lu/mirrors
五、初始化master
1、初始化master,所有master算作控制平面節(jié)點
1) 在master1編寫集群的的初始化配置文件
? 集群版本是v1.14.3
? 指定集群的api端口和地址
? 使用flannel,指定pod端口范圍"10.244.0.0/16"
? 模板文件生成參考:
kubeadm config print init-defaults --component-configs KubeletConfiguration
? 說明:
apiServer:
timeoutForControlPlane: 4m0s #超時時間
apiVersion: kubeadm.k8s.io/v1beta1 #版本信息
certificatesDir: /etc/kubernetes/pki #證書位置
clusterName: kubernetes #集群名稱
controlPlaneEndpoint: "" #控制平面LOAD_BALANCER_DNS:LOAD_BALANCER_PORT
controllerManager: {}
dns:
type: CoreDNS #dns類型
etcd:
local:
dataDir: /var/lib/etcd #etcd位置
imageRepository: k8s.gcr.io #鏡像倉庫
kind: ClusterConfiguration #類型是集群配置
kubernetesVersion: v1.14.0 # kubernetes版本
networking:
dnsDomain: cluster.local #dns
podSubnet: "" #子網(wǎng)類型,和插件有關(guān)
serviceSubnet: 10.96.0.0/12 #service地址設(shè)定
scheduler: {}
? 最終配置文件
cat <EOF > kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.14.3
controlPlaneEndpoint: "192.168.14.142:8443"
networking:
podSubnet: "10.244.0.0/16"
EOF
2) 執(zhí)行初始化
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
#--pod-network-cidr=10.244.0.0/16 設(shè)置flannel子網(wǎng)地址訪問
# --experimental-upload-certs標志用于將應(yīng)在所有控制平面實例之間共享的證書上載到群集,主控制平面的證書被加密并在上傳的kubeadm-certs sercert
3) 初始化完成后的主要提示如下
其他的master節(jié)點加入控制平面的命令
kubeadm join 192.168.14.142:8443 --token g9up4e.wr2zvn1y0ld2u9c8 --discovery-token-ca-cert-hash sha256:d065d5c2bfce0f5e0f784ed18cb0989dd19542721969c12888f04496b03f121c --experimental-control-plane --certificate-key ddad01f830084f0dd4a9f89e914020cf1001aa31f4550cf5fccce9bad2d6d599
node節(jié)點加入node的命令
kubeadm join 192.168.14.131:6443 --token xl9aa5.2lxz30aupuf9lbhh --discovery-token-ca-cert-hash sha256:0fa135166d86ad9e654f7b92074b34a42a5a25152c05e9253df62af8541c7bad
配置kubeconfig的命令提示
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4)配置kubectl,主要是配置訪問apiserver 的權(quán)限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
5)kubectl命令補選
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
? 2、初始化控制平面其他master 主機
其他的master節(jié)點加入控制平面的命令
kubeadm join 192.168.14.142:8443 --token g9up4e.wr2zvn1y0ld2u9c8 --discovery-token-ca-cert-hash sha256:d065d5c2bfce0f5e0f784ed18cb0989dd19542721969c12888f04496b03f121c --experimental-control-plane --certificate-key
? 3、集群證書和hash值,2個小小時后過期。重新生成證書方法如下
控制平面生成證書的解密密鑰
sudo kubeadm init phase upload-certs --experimental-upload-certs
集群重新生成token
kubeadm token create
集群重新生成hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
控制平面重新加入集群的方法
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash> --experimental-control-plane --certificate-key cert
work節(jié)點重新加入集群的方法
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
4、檢查三臺master是否初始化成功
kubectl get nodes
六、 將worker節(jié)點加入集群
kubeadm join 192.168.14.131:6443 --token xl9aa5.2lxz30aupuf9lbhh --discovery-token-ca-cert-hash sha256:0fa135166d86ad9e654f7b92074b34a42a5a25152c05e9253df62af8541c7bad
七、安裝網(wǎng)絡(luò)插件Flannel(主節(jié)點運行即可)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
八、查看集群狀態(tài)
master1 Ready master 4h51m v1.14.3
master2 Ready <none> 4h46m v1.14.3
master3 Ready master 4h60m v1.14.3
worker1 Ready master 4h49m v1.14.3
參考鏈接:
kubeadm高可用安裝kubernetes v1.14.3
通過kubeadm創(chuàng)建單個集群
通過kubeadm創(chuàng)建高可用集群
通過kubeadm配置集群中的每個kubelet
后續(xù)繼續(xù)補充,mark!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。