K8s单节点高可用集群安装记录(1-20-6 docker版)

2023-10-27 / 0 评论 / 256 阅读
温馨提示:
本文最后更新于 2023-10-27,已超过半年没有更新,若内容或图片失效,请留言反馈。

1、通过centos模板机创建三台主机,修改主机名,设置网络静态地址如下:
主机1:hmaster1 IP 192.168.40.180
主机2:hnode1 IP 192.168.40.181
主机3:hnode2 IP 192.168.40.182
2、检查SELINUX是否关闭,执行getenforce
打开修改 vim /etc/selinux/config
编辑 SELINUX=disabled
保存退出,重启服务器才可生效。
其他命令: sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #修改selinux配置文件之后,重启机器,selinux配置才能永久生效
3、配置主机hosts文件,相互之间通过主机名互相访问,修改每台机器的/etc/hosts文件,增加如下三行:
192.168.40.180 hmaster1
192.168.40.181 hnode1
192.168.40.182 hnode2

[root@hmaster1 ~]# vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.40.180 hmaster1192.168.40.181 hnode1192.168.40.182 hnode2

4、配置主机之间无密码登录命令
在三主机分别执行:ssh-keygen -t rsa #生成登陆秘钥
ssh-copy-id hmaster1
ssh-copy-id hnode1
ssh-copy-id hnode2
5、关闭交换分区swap,提升性能

临时关闭 root@hmaster1 ~]# swapoff -a

#永久关闭:注释掉/etc/fstab里的swap挂载,给swap这行开头加一下注释问题1:为什么要关闭swap交换分区?Swap是交换分区,如果机器内存不够,会使用swap分区,但是swap分区的性能较低,k8s设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s的时候可以指定--ignore-preflight-errors=Swap来解决。

6、修改机器内核参数,设置IP转发
[root@hmaster1 ~]# modprobe br_netfilter
[root@hmaster1 ~]# echo "modprobe br_netfilter" >> /etc/profile
[root@hmaster1 ~]# cat > /etc/sysctl.d/k8s.conf <<EOF

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@hmaster1 ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

hnode1和hnode2采用相同操作。

7、关闭firewalld防火墙,并设置随机不启动
命令1:systemctl stop firewalld ; systemctl disable firewalld
也可以执行命令2:systemctl disable firewalld --now
如下:
[root@hmaster1 ~]# ps -ef|grep firewall
root 753 1 0 12:18 ? 00:00:00 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
root 18709 18598 0 18:12 pts/0 00:00:00 grep --color=auto firewall
[root@hmaster1 ~]# systemctl disable firewalld --now
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@hmaster1 ~]# ps -ef|grep firewall
root 18768 18598 0 18:12 pts/0 00:00:00 grep --color=auto firewall
8、配置阿里云的repo源
命令: yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

9、安装基础依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack ntpdate telnet ipvsadm

10、 配置安装k8s组件需要的阿里云的repo源
[root@hmaster1 ~]#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=0

将新创建好的repo源文件复制到其他节点相应的目录下。[root@hmaster1 ~]# scp /etc/yum.repos.d/kubernetes.repo hnode1:/etc/yum.repos.d/kubernetes.repo 100% 128 160.2KB/s 00:00 [root@hmaster1 ~]# scp /etc/yum.repos.d/kubernetes.repo hnode2:/etc/yum.repos.d/kubernetes.repo 100% 128 167.7KB/s 00:00 

11、配置时间同步 ntpdate chrony

安装ntpdate命令

 [root@hmaster1 ~]# yum install ntpdate -y #跟网络时间做同步 [root@hmaster1 ~]# ntpdate cn.pool.ntp.org #把时间同步做成计划任务 [root@hmaster1 ~]# crontab -e * */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org wq保存退出,重启计划任务

二、安装docker服务
1、安装 docker-ce
多主机同步执行:yum install -y docker-ce-20.10.6
2、启动docker:
systemctl enable docker --now
查看docker运行状况
systemctl status docker
3、配置docker镜像加速器和驱动
vim /etc/docker/daemon.json
{
"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}

修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认使用systemd,两者必须一致才可以。

systemctl daemon-reload #加载镜像加速器配置文件systemctl restart docker #重启dockersystemctl status docker #检查docker是否正常,如果不能正常启动,检查配置文件

4、安装初始化k8s需要的软件包
yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6
systemctl enable kubelet #设置kubelet随机启动,不然会导致pod无法启动。
注:每个软件包的作用
Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
kubelet: 安装在集群所有节点上,用于启动Pod的
kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

5、kubeadm初始化k8s集群
将镜像包k8simage-1-20-6.tar.gz上传到三台服务器上,手动解压:

docker load -i k8simage-1-20-6.tar.gz三个机器都需要解压

6、使用kubeadm初始化k8s集群
[root@hmaster1~]# kubeadm config print init-defaults > kubeadm.yaml #获取初始化模板文件
kubeadm.yaml的修改配置如下:
[root@hmaster1 ~]# cat kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:

  • groups:

    • system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
    • signing
    • authentication
      kind: InitConfiguration
      localAPIEndpoint:
      advertiseAddress: 192.168.40.180
      bindPort: 6443
      nodeRegistration:
      criSocket: /var/run/dockershim.sock
      name: hmaster1
      taints:
    • effect: NoSchedule
      key: node-role.kubernetes.io/master

      apiServer:
      timeoutForControlPlane: 4m0s
      apiVersion: kubeadm.k8s.io/v1beta2
      certificatesDir: /etc/kubernetes/pki
      clusterName: kubernetes
      controllerManager: {}
      dns:
      type: CoreDNS
      etcd:
      local:
      dataDir: /var/lib/etcd
      imageRepository: registry.aliyuncs.com/google_containers
      kind: ClusterConfiguration
      kubernetesVersion: v1.20.6
      networking:
      dnsDomain: cluster.local
      serviceSubnet: 10.96.0.0/12
      podSubnet: 10.244.0.0/16 #指定pod网段, 需要新增加这个
      scheduler: {}

      追加如下几行


      apiVersion: kubeproxy.config.k8s.io/v1alpha1
      kind: KubeProxyConfiguration
      mode: ipvs

      apiVersion: kubelet.config.k8s.io/v1beta1
      kind: KubeletConfiguration
      cgroupDriver: systemd

    kubeadm.yaml修改后执行以下命令初始化kubernetes集群

    kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification

    初始化成功后会有 kubeadm join ****类似字样,如本次实验的结果如下:

    ********Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.40.180:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:7d94828271cba0b82e91497c7780d0079241c29937e2abd4d814579cb3317de0 扩展:kubeadm init初始化流程分析

    1) 检查执行 init 命令的用户是否为 root,如果不是 root,直接快速失败(fail fast);
    2) 检查待安装的 k8s 版本是否被当前版本的 kubeadm 支持(kubeadm 版本 >= 待安装 k8s 版本);
    3) 检查防火墙,如果防火墙未关闭,提示开放端口 10250;
    4) 检查端口是否已被占用,6443(或你指定的监听端口)、10257、10259;
    5) 检查文件是否已经存在,/etc/kubernetes/manifests/*.yaml;
    6) 检查是否存在代理,连接本机网络、服务网络、Pod网络,都会检查,目前不允许代理;
    7) 检查容器运行时,使用 CRI 还是 Docker,如果是 Docker,进一步检查 Docker 服务是否已启动,是否设置了开机自启动;
    8) 对于 Linux 系统,会额外检查以下内容:
    8.1) 检查以下命令是否存在:crictl、ip、iptables、mount、nsenter、ebtables、ethtool、socat、tc、touch;
    8.2) 检查 /proc/sys/net/bridge/bridge-nf-call-iptables、/proc/sys/net/ipv4/ip-forward 内容是否为 1;
    8.3) 检查 swap 是否是关闭状态;
    9) 检查内核是否被支持,Docker 版本及后端存储 GraphDriver 是否被支持;
    对于 Linux 系统,还需检查 OS 版本和 cgroup 支持程度(支持哪些资源的隔离);
    10) 检查主机名访问可达性;
    11) 检查 kubelet 版本,要高于 kubeadm 需要的最低版本,同时不高于待安装的 k8s 版本;
    12) 检查 kubelet 服务是否开机自启动;
    13) 检查 10250 端口是否被占用;
    14) 如果开启 IPVS 功能,检查系统内核是否加载了 ipvs 模块;
    15) 对于 etcd,如果使用 Local etcd,则检查 2379 端口是否被占用, /var/lib/etcd/ 是否为空目录;
    如果使用 External etcd,则检查证书文件是否存在(CA、key、cert),验证 etcd 服务版本是否符合要求;
    16) 如果使用 IPv6,
    检查 /proc/sys/net/bridge/bridge-nf-call-iptables、/proc/sys/net/ipv6/conf/default/forwarding 内容是否为 1;
    以上就是 kubeadm init 需要检查的所有项目了!

完成安装前的配置
1) 在 kube-system 命名空间创建 ConfigMap kubeadm-config,同时对其配置 RBAC 权限;
2) 在 kube-system 命名空间创建 ConfigMap kubelet-config-,同时对其配置 RBAC 权限;
3) 为当前节点(Master)打标记:node-role.kubernetes.io/master=;
4) 为当前节点(Master)补充 Annotation;
5) 如果启用了 DynamicKubeletConfig 特性,设置本节点 kubelet 的配置数据源为 ConfigMap 形式;
6) 创建 BootStrap token Secret,并对其配置 RBAC 权限;
7) 在 kube-public 命名空间创建 ConfigMap cluster-info,同时对其配置 RBAC 权限;
8) 与 apiserver 通信,部署 DNS 服务;
9) 与 apiserver 通信,部署 kube-proxy 服务;
10) 如果启用了 self-hosted 特性,将 Control Plane 转为 DaemonSet 形式运行;
11) 打印 join 语句;

 #配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理 [root@hmaster1 ~]# mkdir -p $HOME/.kube [root@hmaster1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@hmaster1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config [root@hmaster1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION hmaster1 NotReady control-plane,master 18m v1.20.6在hnode1、hnode2工作节点上执行以下命令,加入集群(获取的token一般24小时内有效)kubeadm join 192.168.40.180:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:7d94828271cba0b82e91497c7780d0079241c29937e2abd4d814579cb3317de0 --ignore-preflight-errors=SystemVerification返回hmaster1节点查看[root@hmaster1 ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONhmaster1 NotReady control-plane,master 26m v1.20.6hnode1 NotReady <none> 4m49s v1.20.6hnode2 NotReady <none> 10s v1.20.6给工作节点打标签可执行以下命令:kubectl label node hnode2 node-role.kubernetes.io/worker=worker [root@hmaster1 ~]# kubectl label node hnode2 node-role.kubernetes.io/worker=worker node/hnode2 labeled [root@hmaster1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION hmaster1 NotReady control-plane,master 37m v1.20.6 hnode1 NotReady <none> 15m v1.20.6 hnode2 NotReady worker 10m v1.20.6 [root@hmaster1 ~]# kubectl label node hnode1 node-role.kubernetes.io/worker=worker node/hnode1 labeled [root@hmaster1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION hmaster1 NotReady control-plane,master 37m v1.20.6 hnode1 NotReady worker 16m v1.20.6 hnode2 NotReady worker 11m v1.20.6 集群状态还是NotReady状态,因为没有安装网络插件

评论一下?

OωO
取消