K8s keepalived+多Master部署
- 一、前期准备
- 二、keepalived实现(主要在128.128.7.247和128.128.7.248上安装)
- 三、安装k8s
- 四、安装过程中遇到的问题
- 1、IP地址问题,生成第一个master时,一定要用keepalived虚拟的VIP地址128.128.7.246。
- 2、网上拷贝的 kube-flannel.yml与安装k8s的版本问题。
- 3、第二个master安装时controlPlaneEndpoint错误问题。
- 4、第二个master安装时缺少证书配置文件之类问题。
- 5、配置Linux系统的ip转发功能
- 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 节点移出集群
- 6.3 登录已退出集群的 master 服务器重置 kubelet 配置并重新加入集群
- 6.4 分析问题
- 6.5 登录其中一台正常的 master ,进入 etcd 容器
- 6.6 查看 etcd 集群的成员列表,找到那台已经退出集群的服务器
- 6.7 在容器中将这台服务器从 etcd 集群中移除
- 6.8 再重新加入即可
- 6.9 master节点的更名与上述步骤一致
- 7、添加master失败,重新将该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上拷贝证书