【K8s keepalived+多Master部署】

K8s keepalived+多Master部署

一、前期准备

星缘:
【有道云笔记】K8S部署
https://note.youdao.com/s/dWQDxFoD

星缘:
【有道云笔记】Docker安装手册
https://note.youdao.com/s/2mazmylO

1、准备4台虚拟机

//注意主机名不能有“_”
128.128.7.247 lwp7247    master1
128.128.7.248 lwp7248    master2
128.128.7.249 lwp7249    master3
128.128.7.250 lwp7250    node1
 //master集群的虚拟IP为128.128.7.246

虚拟机的CPU个数必须大于1,Master内存8G

2、安装docker,步骤详见docker安装笔记

(1) 目前只有阿里云yum源可用,对于非阿里云yum源,采取先步骤

cd /etc/yum.repos.d/
mv CentOS-CR.repo CentOS-CR.repo.bak --备份旧镜像文件
wget http://mirrors.aliyun.com/repo/Centos-7.repo

(2)安装依赖

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

(2)设置yum源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(3)安装docker

 yum install docker-ce docker-ce-cli containerd.io

3、把docker加入到systemd

默认k8s在systemd组下

 vi /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

如果已经安装k8s,docker未在systemd组,还需运行下面脚本

sed -i "s/cgroupDriver: systemd/cgroupDriver: cgroupfs/g" /var/lib/kubelet/config.yaml
systemctl daemon-reload
systemctl restart kubelet

4、关闭selinux, firewalld, swap

(1)centos 关闭selinux(需要关闭SELinux 或者 将enforcing改为 permissive 模式)
查看状态  sestatus -v 或者  sestatus   如果SELinux status参数为enabled即为开启状态

1)临时关闭(不用重启机器,重启后状态恢复):
setenforce 0           ##设置SELinux 成为permissive模式
                              ##setenforce 1 设置SELinux 成为enforcing模式
2)修改配置文件需要重启机器:
修改/etc/selinux/config 文件
vim /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可
========================================================================
(2)centos 关闭firewalld(需要关闭firewalld )
systemctl list-unit-files|grep firewalld
启动一个服务:systemctl start firewalld
关闭一个服务:systemctl stop firewalld
重启一个服务:systemctl restart firewalld
显示一个服务的状态:systemctl status firewalld
在开机时启用一个服务:systemctl enable firewalld
在开机时禁用一个服务:systemctl disable firewalld
========================================================================
(3)centos 关闭swap
swapoff -a
vi /etc/fstab    将 /swapfile none swap defaults 0 0 这一行前面加个 # 号将其注释掉

5、时间同步【启动chronyd系统服务】

systemctl  start  chronyd   --启动时间同步进程 
systemctl  enable  chronyd   --将时间同步进程加入系统启动时,自动加载

二、keepalived实现(主要在128.128.7.247和128.128.7.248上安装)

1、安装keepalived的依赖包

yum install gcc
yum install openssl  openssl-devel

2、安装keepalived软件包

(1)将下载的keepalived-2.2.7.tar.gz解压到/usr/local/src目录下

(2)编译该软件包

./configure --prefix=/usr/local/keepalived   //指定编译后软件存放目录
make && make install 

3、编辑keepalived的配置文件

(1)128.128.7.247的配置文件: vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     //设置一般邮箱,用于通知
     675XXX425@qq.com
   }
   #标志本服务器的字符串,一般为主机名
   router_ id lwp7247
   script_user root
}
#定义一个周期执行脚步,判断该master是运行
vrrp_script chk_nginx {
    script "/usr/local/keepalived/check_k8s_status.sh"
    //间隔2秒
    interval 2
}

vrrp_instance VI_1 {
   #主节点
    state MASTER
    #指定网卡,看128.128.7.247的地址绑定到哪个物理网卡,ipconfig -a 查看
    interface ens33
    #虚拟路由标识,这个标识是一个数字(取值在 0-255 之间,用来区分多个instance 的 VRRP 组播),
    #同一个集群网络内,必须要要不同,否则冲突
    virtual_router_id 60
    #用来选举master的,要成为 master,该项取值范围是1-255(在此范围之外会被识别成默认值100),master的值大于backup的值
    priority 100
    #发 VRRP 包的时间间隔,即多久进行一次 master 选举(可以认为是健康查检时间间隔)
    advert_int 2
    #证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
    # type设置类型,pass设置密码,如果是一个服务高可用,2台keepavlied的密码应该一样。
    authentication {
        auth_type PASS
        auth_pass sxslgdgs
    }
    virtual_ipaddress {
        #指定vip地址
        128.128.7.246/24 dev ens33
    }
   
    track_script {
     chk_nginx
    }
    garp_master_delay 2
    preempt_delay 300
   //发生切换时,通过脚本写入日志文件中
    notify_master /usr/local/keepalived/notify_master.sh
    notify_backup /usr/local/keepalived/notify_backup.sh
}

(2)128.128.7.248的配置文件: vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
        675XXX425@qq.com
   }
     router_ id lwp7248
   script_user root
}
vrrp_script chk_nginx {
    script "/usr/local/keepalived/check_k8s_status.sh"
    interval 2
}

vrrp_instance VI_1 {
   #从节点
    state BACKUP
    interface ens33
    #必须与MASTER节点相同
    virtual_router_id 60
    #小于MASTER节点的值
    priority 80
        advert_int 2
    #与MASTER的值相同
    authentication {
        auth_type PASS
        auth_pass sxslgdgs
    }
    virtual_ipaddress {
        #IP与Master节点的值相同,后面绑定的网卡根据本机的实际网卡
        128.128.7.246/24 dev ens33
    }
   
    track_script {
     chk_nginx
    }
    garp_master_delay 2
    preempt_delay 300
    notify_master /usr/local/keepalived/notify_master.sh
    notify_backup /usr/local/keepalived/notify_backup.sh
}

4、启动keepalived

(1)配置systemctl服务

cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/init.d/keepalived

(2)启动keepalived服务

#启动keepalived
systemctl start  keepalived
#设置开机自启动
systemctl enable keepalived

(3)查看128.128.6.246在那台服务器中

IP addr

在这里插入图片描述

三、安装k8s

1、通用安装(master和node均安装)

1.1 配置k8s.conf文件

vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0

保存后重启生效,或运行sysctl --system

1.2 添加阿里云YUM软件源

在/etc/yum.repos.d目录下vim /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

若阿里云有问题,按腾讯云配置

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.cloud.tencent.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://mirrors.cloud.tencent.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.cloud.tencent.com/kubernetes/yum/doc/rpm-package-key.gpg      

注意:安装提示加载此文件失败,查看gpgkey行是否变成了2行,必须是1行

1.3 安装kubeadm,kubelet和kubectl

apt-mark hold kubelet kubeadm kubectl --让k8s软件 不随系统更新,虚拟机不需要运行

在部署kubernetes时,要求master node和worker node上的版本保持一致,否则会出现版本不匹配导致奇怪的问题出现。
我们需要安装指定版本的kubernetes。那么如何做呢?在进行yum安装时,可以使用下列的格式来进行安装:

yum install -y kubelet-<version> kubectl-<version> kubeadm-<version>

yum list kubelet kubeadm kubectl  --showduplicates|sort -r   查看kubelet kubeadm kubectl的可用版本
 
yum install -y kubelet-1.23.4
yum install -y kubectl-1.23.4
yum install -y kubeadm-1.23.4
yum install -y kubernetes-cni-1.23.4 (安装失败)

1.4 启动kubelet

systemctl enable kubelet  设置kubelet开机启动
systemctl start kubelet

2、安装第一个master(128.128.7.247)

2.1 master节点初始化

(1)操作命令,注意是VIP地址及246不是本机地址247

kubeadm init --apiserver-advertise-address=128.128.7.246 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16    

(2)128.128.7.246为虚拟的master节点IP;10.244.0.0/16是k8s内部使用网段

(3)上述命令耗时较长,原因是在下载东西。如果失败,先查看是否全部下载失败,下载失败的单独下载后在初始化

(4)说明:这是我第一次安装时遇到的坑,我最初用的128.128.7.247地址,来用 kubeadm join 128.128.6.246 时报错,要连接的是247不是246,如果连接247那么keepalived就不起作用了。

2.2 执行初始化成功后的命令

在这里插入图片描述

2.3 安装Pod网络插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

(1)远程不可用时,自己生成本地的kube-flannel.yml(下载或拷贝)到指定目录(一般为/usr/local/src),然后运行。生成kube-flannel.yml用vi不能用vim,否则格式会变。

kubectl apply -f  kube-flannel.yml

(2)网上下载或拷贝的内容有3处错误,安装时需要按提示修改。主要是版本问题,去掉提示中的v1beta1中的beta1,保留v1即可。

(3)kubectl get pods -n kube-system 可以查看状态 kubectl get node 查看节点,发现codedns的两个pod一直处于pending状态
在这里插入图片描述
(4)下载calico.yaml 解决此类问题,再查看状态均已Running 。

//可以下载calico.yaml ,安装
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
kubectl apply -f calico.yaml 
kubectl get pods -n kube-system

3、安装第二个master(128.128.7.248)

(1)从第一个master节点获取token和join字符串

kubeadm token create --print-join-command

(2)运行增加master节点命令,第一步生成的字符串末尾添加 --control-plane;注意这里的地址是128.128.7.246

kubeadm join 128.128.7.246:6443   --token 8owxpi.z70pvmu23u63lw9z --discovery-token-ca-cert-hash sha256:552c8c55d6c33e368d5a941ea5e3dc4e5682a24f6e77cc9e38ca370879339ffc --control-plane

(3)报缺少controlPlaneEndpoint错误。需要在128.128.7.247上运行kubectl -n kube-system edit cm kubeadm-config,添加一行controlPlaneEndpoint: 128.128.7.246:6443,修改后的内容如下:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        authorization-mode: Node,RBAC
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns: {}
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.aliyuncs.com/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: v1.23.14
    #下面一行是增加的内容
    controlPlaneEndpoint: 128.128.7.246:6443
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16
      serviceSubnet: 10.96.0.0/12
    scheduler: {}
kind: ConfigMap
metadata:
  creationTimestamp: "2022-11-23T11:36:50Z"
  name: kubeadm-config
  namespace: kube-system
  resourceVersion: "3197"
  uid: c5594d72-ed97-428c-8e0c-aa11e15ba61e

(4)重启kubelet后再运行第三步脚本 kubeadm join 。。。,报缺少ca.crt、ca.key及配置文件之类的错误。需将128.128.7.247的证书及配置文件拷贝到248上,在248上运行下面脚本。

mkdir -p /etc/kubernetes/pki/etcd
scp root@128.128.7.247:/etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/
scp root@128.128.7.247:/etc/kubernetes/pki/ca.key /etc/kubernetes/pki/
scp root@128.128.7.247:/etc/kubernetes/pki/sa.key /etc/kubernetes/pki/
scp root@128.128.7.247:/etc/kubernetes/pki/sa.pub /etc/kubernetes/pki/
scp root@128.128.7.247:/etc/kubernetes/pki/front-proxy-ca.crt /etc/kubernetes/pki/
scp root@128.128.7.247:/etc/kubernetes/pki/front-proxy-ca.key /etc/kubernetes/pki/
scp root@128.128.7.247:/etc/kubernetes/pki/etcd/ca.crt /etc/kubernetes/pki/etcd/
scp root@128.128.7.247:/etc/kubernetes/pki/etcd/ca.key /etc/kubernetes/pki/etcd/
scp root@128.128.7.247:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf

(5)在运行第三步脚本 kubeadm join 。。。,后,执行该命令输出的后面几行内容

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4、以此类推安装安装第三个master(128.128.7.249)

5、node节点(128.128.7.250)安装比较简单,执行运行下面脚本即可

kubeadm join 128.128.7.246:6443 --token 3yj3v6.uwm0bigevrq0nbv2 --discovery-token-ca-cert-hash sha256:552c8c55d6c33e368d5a941ea5e3dc4e5682a24f6e77cc9e38ca370879339ffc

四、安装过程中遇到的问题

1、IP地址问题,生成第一个master时,一定要用keepalived虚拟的VIP地址128.128.7.246。

2、网上拷贝的 kube-flannel.yml与安装k8s的版本问题。

3、第二个master安装时controlPlaneEndpoint错误问题。

kubectl -n kube-system edit cm kubeadm-config
添加:controlPlaneEndpoint: 128.128.7.246:6443

4、第二个master安装时缺少证书配置文件之类问题。

#创建目录
  mkdir -p /etc/kubernetes/pki/etcd
 #从正常的master中拷贝证书(下面的地址依据集群实际的运行正常master服务器的ip 
  scp -rp 128.128.6.248:/etc/kubernetes/pki/ca.* /etc/kubernetes/pki
  scp -rp 128.128.6.248:/etc/kubernetes/pki/sa.* /etc/kubernetes/pki
  scp -rp 128.128.6.248:/etc/kubernetes/pki/front-proxy-ca.* /etc/kubernetes/pki
  scp -rp 128.128.6.248:/etc/kubernetes/pki/etcd/ca.* /etc/kubernetes/pki/etcd
  scp -rp 128.128.6.248:/etc/kubernetes/admin.conf /etc/kubernetes

5、配置Linux系统的ip转发功能

临时设置
1、sysctl -w net.ipv4.ip_forward=1

2、echo 1 > /proc/sys/net/ipv4/ip_forward
持久化设置
修改 /etc/sysctl.conf 配置文件
net.ipv4.ip_forward=1
sysctl -p

6、当一个master出现问题后,主机重装系统如何重新加入master集群

6.1 按上述文档要求安装docker和k8s的三大主件:yum install -y kubelet-1.23.4、yum install -y kubectl-1.23.4、yum install -y kubeadm-1.23.4。

6.2 登录另外一台 master 节点将要重新加入的 master 节点移出集群

#移除重装前的master主机
kubectl delete master247 

6.3 登录已退出集群的 master 服务器重置 kubelet 配置并重新加入集群

kubeadm join 128.128.6.246:6443  \
--token 8h3xsp.ytyolbdlpc0s4lgl  \
--discovery-token-ca-cert-hash sha256:0aa58b08a92dff7ea900ee068eb55e988104041d1d1fa3e9d046adff68eff2fe  
 --control-plane --v=5

加入失败,错误信息如下

etcd.go:388] Failed to get etcd status for https://128.128.6.247:2379: 
failed to dial endpoint https://128.128.6.247:2379 with maintenance client: context deadline exceeded
failed to dial endpoint https://1128.128.6.247:2379 with maintenance client: context deadline exceeded

6.4 分析问题

从错误信息看 etcd 集群不知道 128.128.6.247 已经退出 k8s 集群,etcd 集群中还保存着 128.128.6.247的信息,所以在加入时连接 128.128.6.247失败。

6.5 登录其中一台正常的 master ,进入 etcd 容器

docker exec -it $(docker ps -f name=etcd_etcd -q) /bin/sh

6.6 查看 etcd 集群的成员列表,找到那台已经退出集群的服务器

etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member list

sh-5.1# <tcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member list
92231b78fe81d31b, started, node-master248, https://128.128.6.248:2380, https://10.1.100.248:2379, false
bdf80a1aa639d3c7, started, master247, https://128.128.6.247:2380, https://10.1.100.247:2379, false
efe2caecb627c12e, started, node-master249, https://128.128.6.249:2380, https://10.1.100.249:2379, false

6.7 在容器中将这台服务器从 etcd 集群中移除

etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member remove 1bdf80a1aa639d3c7

6.8 再重新加入即可

kubeadm join 128.128.6.246:6443  \
--token 8h3xsp.ytyolbdlpc0s4lgl  \
--discovery-token-ca-cert-hash sha256:0aa58b08a92dff7ea900ee068eb55e988104041d1d1fa3e9d046adff68eff2fe  
 --control-plane --v=5

6.9 master节点的更名与上述步骤一致

7、添加master失败,重新将该master加入集群的步骤

7.1 删除相关文件

rm -rf /etc/kubernetes/*
rm -rf ~/.kube/*
rm -rf /var/lib/etcd/*
关闭相应端口

7.2 使用命令清除环境:

kubeadm reset
#重新运行正常的master上拷贝证书

7.3 再重新加入

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值