导航

使用kubeadm搭建k8s高可用集群教程

Posted on 2022-08-18 11:35  Young哥哥  阅读(715)  评论(0编辑  收藏  举报

实验环境规划:

操作系统:centos7.6

配置: 4Gib 内存/6vCPU/100G 硬盘

网络:NAT

开启虚拟机的虚拟化:

1、初始化安装 k8s 集群的实验环境

1.1 修改机器 IP,变成静态 IP

vim /etc/sysconfig/network-scripts/ifcfg-ens33 文件

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.40.180
NETMASK=255.255.255.0
GATEWAY=192.168.40.2
DNS1=192.168.40.2
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes

#修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:

service network restart

注:/etc/sysconfig/network-scripts/ifcfg-ens33 文件里的配置说明:

NAME=ens33	#网卡名字,跟 DEVICE 名字保持一致即可

DEVICE=ens33   #网卡设备名,大家 ip addr 可看到自己的这个网卡设备名,每个人的机器可能这个名

字不一样,需要写自己的

BOOTPROTO=static   #static 表示静态 ip 地址

ONBOOT=yes	#开机自启动网络,必须是 yes

IPADDR=192.168.40.180   #ip 地址,需要跟自己电脑所在网段一致

NETMASK=255.255.255.0  #子网掩码,需要跟自己电脑所在网段一致

GATEWAY=192.168.40.2   #网关,在自己电脑打开 cmd,输入 ipconfig /all 可看到

DNS1=192.168.40.2   #DNS,在自己电脑打开 cmd,输入 ipconfig /all 可看到


1.2 配置机器主机名

在 192.168.40.180 上执行如下:

hostnamectl set-hostname xianchaomaster1 && bash

在 192.168.40.181 上执行如下:

hostnamectl set-hostname xianchaonode1 && bash

1.3 配置主机 hosts 文件,相互之间通过主机名互相访问

修改每台机器的/etc/hosts 文件,增加如下三行:

192.168.40.180 xianchaomaster1

192.168.40.181 xianchaonode1

1.4 配置主机之间无密码登录

[root@xianchaomaster1 ~]# ssh-keygen #一路回车,不输入密码

把本地生成的密钥文件和私钥文件拷贝到远程主机

[root@xianchaomaster1 ~]# ssh-copy-id xianchaomaster1

[root@xianchaomaster1 ~]# ssh-copy-id xianchaonode1

[root@ xianchaonode1 ~]# ssh-keygen #一路回车,不输入密码把本地生成的密钥文件和私钥文件拷贝到远程主机

[root@ xianchaonode1 ~]# ssh-copy-id xianchaomaster1

[root@xianchaonode1 ~]# ssh-copy-id xianchaonode1

1.5 关闭交换分区 swap,提升性能

#临时关闭

[root@xianchaomaster1 ~]# swapoff -a

[root@xianchaonode1 ~]# swapoff -a

#永久关闭:注释 swap 挂载,给 swap 这行开头加一下注释

[root@xianchaomaster1 ~]# vim /etc/fstab

#/dev/mapper/centos-swap swap swap defaults 0 0

[root@ xianchaonode1 ~]# vim /etc/fstab

#/dev/mapper/centos-swap swap swap defaults 0 0

问题 1:为什么要关闭 swap 交换分区?

Swap 是交换分区,如果机器内存不够,会使用 swap 分区,但是 swap 分区的性能较低,k8s 设计的

时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm 初始化的时候会检测 swap 是否关

闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装 k8s 的时候可以指定--ignore-

preflight-errors=Swap 来解决。

1.6 修改机器内核参数

[root@xianchaomaster1 ~]# modprobe br_netfilter

[root@xianchaomaster1 ~]# echo "modprobe br_netfilter" >> /etc/profile

[root@xianchaomaster1 ~]# 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@xianchaomaster1 ~]# sysctl -p /etc/sysctl.d/k8s.conf

[root@xianchaonode1 ~]# modprobe br_netfilter

[root@xianchaonode1 ~]# echo "modprobe br_netfilter" >> /etc/profile

[root@xianchaonode1 ~]# 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@xianchaonode1 ~]# sysctl -p /etc/sysctl.d/k8s.conf

问题 1:sysctl 是做什么的?

在运行时配置内核参数

-p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf 中加载

问题 2:为什么要执行 modprobe br_netfilter?

修改/etc/sysctl.d/k8s.conf文件,增加如下三行参数:

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

sysctl -p /etc/sysctl.d/k8s.conf 出现报错:

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or

directory

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or

directory

解决方法:

modprobe br_netfilter

问题 3:为什么开启 net.bridge.bridge-nf-call-iptables 内核参数?

在 centos 下安装 docker,执行 docker info 出现如下警告:

WARNING: bridge-nf-call-iptables is disabled

WARNING: bridge-nf-call-ip6tables is disabled

解决办法:

vim /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

问题 4:为什么要开启 net.ipv4.ip_forward = 1 参数?

kubeadm 初始化 k8s 如果报错:

就表示没有开启 ip_forward,需要开启。

net.ipv4.ip_forward 是数据包转发:

出于安全考虑,Linux 系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,

其中一块收到数据包,根据数据包的目的 ip 地址将数据包发往本机另一块网卡,该网卡根据路由表继

续发送数据包。这通常是路由器所要实现的功能。

要让 Linux 系统具有路由转发功能,需要配置一个 Linux 的内核参数 net.ipv4.ip_forward。这个

参数指定了 Linux 系统当前对路由转发功能的支持情况;其值为 0 时表示禁止进行 IP 转发;如果是 1,

则说明 IP 转发功能已经打开。

1.7 关闭 firewalld 防火墙

[root@xianchaomaster1 ~]# systemctl stop firewalld ; systemctl disable firewalld

[root@xianchaonode1 ~]# systemctl stop firewalld ; systemctl disable firewalld

1.7 关闭 selinux

[root@xianchaomaster1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'

/etc/selinux/config

#修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效

[root@xianchaonode1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'

/etc/selinux/config

#修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效

[root@xianchaomaster1 ~]#getenforce

Disabled

#显示 Disabled 说明 selinux 已经关闭

[root@xianchaonode1 ~]#getenforce

Disabled

#显示 Disabled 说明 selinux 已经关闭

1.8 配置阿里云的 repo 源

#配置国内阿里云 docker 的 repo 源

[root@xianchaomaster1 ~]#yum install yum-utils -y

[root@xianchaonode1 ~]#yum install yum-utils -y

[root@xianchaomaster1 ~]# yum-config-manager --add-repo

http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@xianchaonode1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.9 配置安装 k8s 组件需要的阿里云的 repo 源

[root@xianchaomaster1 ~]#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

#将 xianchaomaster1 上 Kubernetes 的 repo 源复制给 xianchaonode1

[root@xianchaomaster1 ~]# scp /etc/yum.repos.d/kubernetes.repo

xianchaonode1:/etc/yum.repos.d/

1.10 配置时间同步

在 xianchaomaster1 上执行如下:

#安装 ntpdate 命令

[root@xianchaomaster1 ~]# yum install ntpdate -y

#跟网络时间做同步

[root@xianchaomaster1 ~]# ntpdate cn.pool.ntp.org

#把时间同步做成计划任务

[root@xianchaomaster1 ~]# crontab -e

* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org

#重启 crond 服务

[root@xianchaomaster1 ~]#service crond restart

在 xianchaonode1 上执行如下:

#安装 ntpdate 命令

[root@ xianchaonode1 ~]# yum install ntpdate -y

#跟网络时间做同步

[root@ xianchaonode1 ~]#ntpdate cn.pool.ntp.org

#把时间同步做成计划任务

[root@ xianchaonode1 ~]#crontab -e

* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org

#重启 crond 服务

[root@ xianchaonode1 ~]#service crond restart

1.11 安装基础软件包

[root@xianchaomaster1 ~]# 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

[root@xianchaonode1 ~]# 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

2、安装 docker 服务

2.1 安装 docker-ce

[root@xianchaomaster1 ~]# yum install docker-ce -y

[root@xianchaomaster1 ~]# systemctl start docker && systemctl enable docker.service

[root@xianchaonode1 ~]# yum install docker-ce -y

[root@xianchaonode1 ~]# systemctl start docker && systemctl enable docker.service

2.2 配置 docker 镜像加速器和驱动

[root@xianchaomaster1 ~]#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","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"],

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

}

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

以。

[root@xianchaomaster1 ~]# systemctl daemon-reload && systemctl restart docker

[root@xianchaomaster1 ~]# systemctl status docker

[root@ xianchaonode1 ~]#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","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"],

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

}

[root@xianchaonode1 ~]# systemctl daemon-reload

[root@xianchaonode1 ~]# systemctl restart docker

[root@xianchaonode1 ~]# systemctl status docker

3、安装初始化 k8s 需要的软件包

[root@xianchaomaster1 ~]# yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1

[root@xianchaomaster1 ~]# systemctl enable kubelet

[root@xianchaonode1 ~]# yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1

[root@xianchaonode1 ~]# systemctl enable kubelet

注:每个软件包的作用

Kubeadm: kubeadm 是一个工具,用来初始化 k8s 集群的

kubelet: 安装在集群所有节点上,用于启动 Pod 的

kubectl: 通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

5、kubeadm 初始化 k8s 集群

#把初始化 k8s 集群需要的离线镜像包上传到 xianchaomaster1、xianchaonode1 机器上,手动解

压:

[root@xianchaomaster1 ~]# docker load -i k8s-images-v1.23.1.tar.gz

[root@xianchaonode1 ~]# docker load -i k8s-images-v1.23.1.tar.gz

#使用 kubeadm 初始化 k8s 集群

[root@xianchaomaster1 ~]# kubeadm init --kubernetes-version=1.23.1 --apiserver-

advertise-address=192.168.40.180 --image-repository

registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --ignore-

preflight-errors=SystemVerification

注:--image-repository registry.aliyuncs.com/google_containers:手动指定仓库地址为

registry.aliyuncs.com/google_containers。kubeadm 默认从 k8s.grc.io 拉取镜像,但是 k8s.gcr.io

访问不到,所以需要指定从 registry.aliyuncs.com/google_containers 仓库拉取镜像。

显示如下,说明安装完成:

kubeadm join 192.168.40.180:6443 --token gsa9je.x35o1gfhd4hq26ci \

--discovery-token-ca-cert-hash

sha256:8c18c824fcc6f91dd03205e63005cfeef36061f86d1b14a3ee562a6eb6ad4447

#上面命令是把 node 节点加入集群,需要保存下来,每个人的都不一样

#配置 kubectl 的配置文件 config,相当于对 kubectl 进行授权,这样 kubectl 命令可以使用这个证

书对 k8s 集群进行管理

[root@xianchaomaster1 ~]# mkdir -p $HOME/.kube

[root@xianchaomaster1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@xianchaomaster1 ~]# sudo chown \((id -u):\)(id -g) $HOME/.kube/config

[root@xianchaomaster1 ~]# kubectl get nodes

NAME STATUS ROLES AGE VERSION

xianchaomaster1 NotReady control-plane,master 60s v1.23.1

此时集群状态还是 NotReady 状态,因为没有安装网络插件。

6、扩容 k8s 集群-添加第一个工作节点

在 xianchaomaster1 上查看加入节点的命令:

[root@xianchaomaster1 ~]# kubeadm token create --print-join-command

显示如下:

kubeadm join 192.168.40.180:6443 --token vulvta.9ns7da3saibv4pg1 --discovery-token-

ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a

把 xianchaonode1 加入 k8s 集群:

[root@xianchaonode1~]# kubeadm join 192.168.40.180:6443 --token vulvta.9ns7da3saibv4pg1

--discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a

#看到上面说明 xianchaonode1 节点已经加入到集群了,充当工作节点

#在 xianchaomaster1 上查看集群节点状况:

[root@xianchaomaster1 ~]# kubectl get nodes

NAME STATUS ROLES AGE VERSION

xianchaomaster1 NotReady control-plane,master 53m v1.23.1

xianchaonode1 NotReady 59s v1.23.1

7、安装 kubernetes 网络组件-Calico

上传 calico.yaml 到 xianchaomaster1 上,使用 yaml 文件安装 calico 网络插件 。

[root@xianchaomaster1 ~]# kubectl apply -f calico.yaml

注:在线下载配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml

[root@xianchaomaster1 ~]# kubectl get pod -n kube-system

再次查看集群状态。

[root@xianchaomaster1 ~]# kubectl get nodes

NAME STATUS ROLES AGE VERSION

xianchaomaster1 Ready control-plane,master 58m v1.23.1

xianchaonode1 Ready 5m46s v1.23.1

8、测试在 k8s 创建 pod 是否可以正常访问网络

#把 busybox-1-28.tar.gz 上传到 xianchaonode1 节点,手动解压

[root@xianchaonode1 ~]# docker load -i busybox-1-28.tar.gz

[root@xianchaomaster1 ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm

-it busybox -- sh

/ # ping www.baidu.com

PING www.baidu.com (39.156.66.18): 56 data bytes

64 bytes from 39.156.66.18: seq=0 ttl=127 time=39.3 ms

#通过上面可以看到能访问网络,说明 calico 网络插件已经被正常安装了

9、测试 coredns 是否正常

[root@xianchaomaster1 ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm

-it busybox -- sh

/ # nslookup kubernetes.default.svc.cluster.local

Server: 10.96.0.10

Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name: kubernetes.default.svc.cluster.local

Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

10.96.0.10 就是我们 coreDNS 的 clusterIP,说明 coreDNS 配置好了。

解析内部 Service 的名称,是通过 coreDNS 去解析的。

#注意:

busybox 要用指定的 1.28 版本,不能用最新版本,最新版本,nslookup 会解析不到 dns 和 ip