Kubernetes入门到实践 (二) Kubeadm安装Kubernetes集群

文章目录


一、前言

  在上一篇文章中已经对Kubernetes 与 yum安装Kubernetes集群 进行了介绍和讲解,也提到了Kubernetes集群的五种安装方式,由于yum安装Kubernetes的版本固定为1.5.2,不能安装最新版本,所以在生产环境中,一般很少使用yum方式来进行Kubernetes集群的安装。在生产环境中,用的最多的两种安装方式是:kubeadm安装 和 二进制安装,接下来我们就来讲解一下如何使用kubeadm方式安装Kubernetes集群。



1、安装前的环境准备 (三个节点都需要执行如下操作)

1.1、需要准备三台Linux虚拟机

主机名称 节点名称 IP地址 cpu (处理器数量) 内存 系统及内核
k8s-master master 192.168.198.145 2 2G CentOS7.x,内核版本至少为3.10及以上
k8s-node1 node1 192.168.198.146 2 2G CentOS7.x,内核版本至少为3.10及以上
k8s-node2 node2 192.168.198.147 2 2G CentOS7.x,内核版本至少为3.10及以上

1.2、修改主机名称

//1、查看当前主机的主机名称
hostname

//2、修改当前主机的主机名称
hostnamectl set-hostname 主机名称

这里以修改master节点的主机名为例 (node1 和 node2节点与修改master节点的主机名类似,只不过需要把k8s-master 替换为k8s-node1 和 k8s-node2即可)


1.3、配置ip地址 与 主机名的映射关系

//1、编辑hosts文件
vim /etc/hosts

//2、配置映射关系
192.168.198.145 k8s-master
192.168.198.146 k8s-node1
192.168.198.147 k8s-node2

这里以配置master节点的ip地址 与 主机名的映射关系为例 (node1 和 node2节点与配置master节点的ip地址 与 主机名的映射关系相同)


1.4、关闭firewalld防火墙 和 SELinux

firewalld会影响Docker的网络功能,SELinux是2.6+版本的Linux内核中提供的强制访问控制系统,在很大程度上加强了Linux的安全性,但是它会影响Kubernetes的某些组件功能,所以我们需要在安装部署前将其禁用掉

//-----------------------------------关闭Firewalld防火墙
// 停止firewalld服务
systemctl stop firewalld

// 禁止firewalld开机启动
systemctl disable firewalld

//列出所有iptables规则
iptables -L



//-----------------------------------关闭SELinux
//临时关闭
setenforce 0

//永久关闭SELinux
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

//查看SELinux状态
sestatus




1.5、关闭swap分区 (为了提高k8s的性能,建议关闭swap分区)

由于kubernetes的想法是将实例紧密包装到尽可能接近100%,所有的部署应与CPU或者内存限制固定在一起,所以如果调度一个pod程序发送到一台机器上时,它不应该使用交换,因为这会减慢其运行速度,所以关闭swap主要是为了性能考虑

//临时关闭 swap分区
swapoff -a

//永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

//查看swap分区是否已经关闭,若swap一行都显示0,则表示关闭成功
free -m



1.6、同步系统时间 (多个节点之间强烈建议同步时间)

//1、安装ntpdate
yum install -y ntpdate

//2、同步系统时间,ntp1.aliyun.com为阿里的时间(NTP)服务器
ntpdate ntp1.aliyun.com

//3、创建定时任务来自动同步阿里的时间(NTP)服务器
crontab -e

//4、设置每30分钟同步一次时间
0 */30 * * * ? /usr/sbin/ntpdate ntp1.aliyun.com


设置每30分钟同步一次时间


1.7、配置内核参数,将桥接的IPv4流量传递到iptables的链上

//1、编写kubernetes.conf配置
vim /etc/sysctl.d/kubernetes.conf

//2、填写如下内容
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720

//3、执行命令,使其配置文件生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/kubernetes.conf



可以看到最后一行提示为:sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_max: No such file or directory,这是因为我们当前3.10版本的CentOS内核中,不存在该文件,在后面操作中,我将会升级CentOS内核,升级之后的CentOS内核将包含该文件,所以这里我们暂时忽略该提示


1.8、开启kube-proxy的ipvs前置条件

从kubernetes的1.8版本开始,kube-proxy引入了ipvs模式,ipvs模式与iptables同样基于Netfilter,但是ipvs模式采用的是hash表,因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能

//1、安装ipvsadm 和 ipset
yum -y install ipvsadm ipset

//2、编辑ipvs.modules配置文件,使其永久生效
vim /etc/sysconfig/modules/ipvs.modules

//3、填写如下内容
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

//4、设置文件权限
chmod 755 /etc/sysconfig/modules/ipvs.modules

//5、查看是否已经正确加载所需的内核模块
bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4




1.9、升级CentOS7的内核版本

CentOS内核升级的官方文档:http://elrepo.org/tiki/tiki-index.php

Docker官方对OverlayFS 和 内核版本的要求说明:https://docs.docker.com/storage/storagedriver/overlayfs-driver/

Docker使用OverlayFS作为存储驱动程序,同时Docker为OverlayFS提供了两个存储驱动程序:原始的overlay 和 更新、更稳定的overlay2,但是Docker官方建议如果使用OverlayFS,请使用overlay2驱动程序而不是overlay驱动程序,因为overlay2驱动程序在inode利用率方面更为有效。要使用overlay2驱动程序,就需要Linux内核的版本4.0或更高版本,或者使用3.10.0-514及更高版本的RHEL或CentOS

1.9.1、查看CentOS的内核版本
//查看内核版本
uname -r

//显示内核版本信息如下
3.10.0-693.el7.x86_64

在这里插入图片描述
可以看到centos7 的内核版本,虽然满足条件 (在3.10.0-514之上),但是其内核版本还是比较低的,为了更好的运行docker和kubernetes,建议对centos7的内核进行升级

1.9.2、安装ELRepo 和 kernel
1、载入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

2、安装ELRepo
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

3、安装内核 kernel
yum --enablerepo=elrepo-kernel install -y kernel-ml-devel kernel-ml




1.9.3、查看新安装的内核完整名称
1、查看已安装的内核版本
rpm -qa | grep -i kernel

2、 查找新安装的内核完整名称
cat /boot/grub2/grub.cfg | grep menuentry


可以看到,使用cat /boot/grub2/grub.cfg | grep menuentry命令,输入的第一行内容中包含新安装的内核完整名称信息,其名称为CentOS Linux (5.5.7-1.el7.elrepo.x86_64) 7 (Core)

1.9.4、更改CentOS7默认的系统内核版本

方式一:

//1、更改系统内核版本为最新安装版本
grub2-set-default 'CentOS Linux (5.5.7-1.el7.elrepo.x86_64) 7 (Core)'

//2、查看默认启动内核是否更换成功
grub2-editenv list

//3、重启系统
reboot



方式二:

//1、更改系统内核版本为最新安装版本
grub2-set-default 0 

//2、查看默认启动内核是否更换成功
grub2-editenv list

//3、重启系统
reboot

提示:由于升级后内核版本是往前面插入的,前面在查看新安装的内核完整名称时,我们也看到新安装的内核信息在第一行输出,所以设置启动顺序为0,即可更改为新内核版本



1.9.5、查看系统内核版本是否设置成功
uname -r



1.10、安装 docker

1.10.1、安装wget
yum -y install wget



1.10.2、配置阿里云的docker源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo



1.10.3、指定docker-ce版本安装
//1、查询18.09版的docker-ce
yum  list available docker-ce* --showduplicates|grep 18.09

//2、安装docker
yum -y install docker-ce-18.09.9-3.el7




1.10.4、设置docker开机自启和启动docker,并查看其版本
//1、设置docker开机自启 和 启动docker
systemctl enable docker && systemctl start docker

//2、查看docker版本
docker --version



1.10.5、编辑daemon.json配置文件

阿里云镜像加速器地址获取教程:https://blog.csdn.net/qq_39135287/article/details/101012149#10__150

kubernetes官方安装docker的daemon.json配置文件参考:https://kubernetes.io/docs/setup/production-environment/container-runtimes/

//1、编辑daemon.json配置文件
vim /etc/docker/daemon.json

//2、添加如下内容
{
  "registry-mirrors": ["阿里云镜像加速器地址"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

//3、创建一个docker.service.d目录,用于存放docker的配置文件
mkdir -p /etc/systemd/system/docker.service.d



1.10.6、重新加载daemon.json配置文件 并 重启docker服务
//重新加载daemon.json配置文件
systemctl daemon-reload

//重启服务器
systemctl restart docker



1.11、安装kubeadm、kubelet 和 kubectl

1.11.1、配置阿里云的Kubernetes源
//1、编辑kubernetes.repo文件
vim /etc/yum.repos.d/kubernetes.repo

//2、添加如下内容
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg


解释:
enable=1:表示启用这个源
gpgcheck=1:表示对这个源下载的rpm包进行校验
repo_gpgcheck=1:某些安全性配置文件会在 /etc/yum.conf 内全面启用 repo_gpgcheck,以便能检验软件库中数据的加密签署



1.11.2、安装kubeadm、kubelet 和 kubectl

提示:由于版本更新频繁,这里指定版本号部署

yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0




1.11.3、修改kubelet配置文件,关闭swap
//1、编辑kubelet配置文件
vim /etc/sysconfig/kubelet

//2、添加 --fail-swap-on=false参数
KUBELET_EXTRA_ARGS="--fail-swap-on=false"



1.11.4、设置kubectl为开机自启
systemctl enable kubelet



2、部署Kubernetes Master节点 (在master节点上执行)

2.1、初始化master节点

提示:--apiserver-advertise-address需要改成你自己master节点的ip地址

kubeadm init \
--apiserver-advertise-address=192.168.198.145 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.15.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

1、可以看到程序停止在[preflight] You can also perform this action in beforehand using 'kubeadm config images pull',这是因为它在下载kubernetes相关组件的镜像,所以耐心等待一段时间


2、可以看到安装成功之后,红色方框框起来的两部分内容,在后面的安装过程中需要用上,第一部分内容是用来配置kubectl工具,第二部分内容是在node节点加入时需要此信息

//记录生成token和秘钥,在node节点加入时需要此信息
kubeadm join 192.168.198.145:6443 --token tgmuix.lj2v3b6ogev7yjp6 \
    --discovery-token-ca-cert-hash sha256:2328518d9636ebbe4cdc05f1750e2e89071ef7ed98561f16a1b31f97cdcc628a

提示:master节点的cup数量要大于等于2,否则会报如下错误:

[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2



3、查看下载的kubernetes相关组件镜像

docker images



2.2、配置kubectl工具

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



2.3、导入flannel:v0.11.0-amd64镜像

由于在下一步的应用flannel网络 kube-flannel.yml配置文件中,使用到了flannel:v0.11.0-amd64镜像,而该镜像下载速度太慢,这里我们提前导入该镜像

flannel:v0.11.0-amd64镜像下载:https://pan.baidu.com/s/11ZUyOK8qB3hhb9YPTwNOrQ 提取码:wq9u

docker load -i $(pwd)/flannel-amd.tar

//如果网速好的话,也可以直接去拉取该镜像
docker push quay.io/coreos/flannel:v0.11.0-amd64

注释:
$(pwd)是docker支持的获取当前目录路径的方法,与linux的pwd类似



2.4、应用flannel网络

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



3、部署Kubernetes Node节点 (在node节点上执行)

3.1、导入flannel:v0.11.0-amd64镜像

由于在Node节点在加入Kubernetes集群时,也会去下载flannel:v0.11.0-amd64镜像,所以这里我们也提前导入该镜像

docker load -i $(pwd)/flannel-amd.tar

//如果网速好的话,也可以直接去拉取该镜像
docker push quay.io/coreos/flannel:v0.11.0-amd64

注释:
$(pwd)是docker支持的获取当前目录路径的方法,与linux的pwd类似



3.2、加入Kubernetes集群

kubeadm join 192.168.198.145:6443 --token tgmuix.lj2v3b6ogev7yjp6 \
    --discovery-token-ca-cert-hash sha256:2328518d9636ebbe4cdc05f1750e2e89071ef7ed98561f16a1b31f97cdcc628a

当看到如下输入信息时,则表示加入Kubernetes集群成功

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run ‘kubectl get nodes’ on the control-plane to see this node join the cluster.


提示:如果加入失败,可以使用kubeadm reset命令进行清理,然后再重新加入


4、集群状态监测与ipvs的开启 (在master节点上执行)

4.1、查看集群状态

kubectl get componentstatus

4.2、查看集群各个节点

kubectl get nodes


可以看到此时,node节点还处在NotReady状态 (这是由于启动pod需要时间,多等待一段时间即可)

4.3、查看所有pod是否已经启动成功

kubectl get pods -n kube-system

可以看到有一个名为kube-flannel-ds-amd64-9jhvs的pod处于Error状态 (提示:其实等待一段时间就好了),此时我们可以通过kubectl describe pod kube-flannel-ds-amd64-9jhvs -n kube-system命令查看其详情

可以看到在kube-flannel容器Back-off restarting failed之后,又重新创建并启动了kube-flannel容器


4.4、再次查看集群各个节点状态 和 所有pod状态 (请务必确保所有pod都处于Running状态)

//查看节点状态
kubectl get nodes

//查看pod状态
kubectl get pods -n kube-system



4.5、配置kubectl命令自动补全功能

//1、安装epel-release 和 bash-completion
yum install -y epel-release bash-completion

//2、配置kubectl命令自动补全
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

//3、测试配置是否成功
kubectl tab键




4.6、配置kube-proxy开启ipvs

4.6.1、编辑资源类型为configmap的kube-proxy

提示:资源类型为configmap 可以简写成 cm

//1、编辑kube-proxy
kubectl edit cm kube-proxy -n kube-system

//2、修改mode
mode: ""   修改为  mode: "ipvs"



4.6.2、删除之前运行的资源类型为pod的kube-proxy
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'



4.6.3、查看新的资源类型为pod的kube-proxy是否启动

提示:如果执行如下命令,没有结果输出,请耐心等待一段时间,再执行如下命令,启动pod也是需要花一段时间的

kubectl get pods -n kube-system | grep kube-proxy



4.6.4、查看kube-proxy是否开启ipvs
ipvsadm -Ln

kube-proxy未开启ipvs前的输出结果:


kube-proxy开启ipvs后的输出结果:


4.7、测试DNS是否可用

4.7.1、查看资源类型为svc的kubernetes的ClusterIP地址

提示:资源类型为service 可以简写成 svc

kubectl get svc



4.7.2、去除污点标记

由于使用kubeadm初始化集群,出于安全考虑,Pod是不会被调度到Master节点上的,也就是说Maste节点不参与工作负载,如果不去除Master节点的污点标记,则创建的pod会一直处于Pending状态,同时使用kubectl describe pod pod资源名称会提示nodes are available: node(s) had taints that the pod didn't tolerate.(节点是可用的: 节点有污染,pod不能容忍)

//1、查看污点标记
kubectl get no -o yaml | grep taint -A 5

//2、去除master节点污点标记
kubectl taint nodes --all node-role.kubernetes.io/master-

//3、再次查看污点标记
kubectl get no -o yaml | grep taint -A 5


可以看到如下信息,显示Master的 effect为NoSchedule

  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
status:
  addresses:
  - address: 192.168.198.145



4.7.3、测试DNS 通过资源类型名称解析其ClusterIP地址
//1、拉取radial/busyboxplus镜像
docker pull radial/busyboxplus

//2、创建deployment类型资源 (deployment控制器会启动pod)
kubectl run -it busyboxplus --image=radial/busyboxplus

//3、解析其ClusterIP
nslookup kubernetes



可以看到kubernetes解析的ClusterIP地址为10.96.0.1,与我们之前查看资源类型为svc的kubernetes的ClusterIP地址一致,同时还能看到kube-dns对应的ClusterIP地址为10.96.0.10



5、安装镜像仓库

由于HarBor镜像仓库需要更多的资源,所以这里我选择是Registry镜像仓库

registry镜像仓库的搭建:https://blog.csdn.net/qq_39135287/article/details/103307664

如果Master节点服务器配置比较高 或者 电脑配置比较高可以虚拟出多台虚拟机的话,可以尝试搭建 企业级容器镜像仓库HarBor:https://blog.csdn.net/qq_39135287/article/details/104041772

由于我的电脑配置低,虚拟一台虚拟机安装HarBor镜像仓库会导致电脑运行很卡,所以这里我直接选择在Master节点上安装registry镜像仓库,提示:安装好镜像仓库后,不要忘了在所有节点(包括master节点) 的daemon.json配置文件中,配置镜像仓库的地址,让docker信任私有仓库地址


6、常见问题

6.1、忘记token或者token失效,后续节点如何重新加入集群

6.1.1、生成新的token并查看token
//方式一:生成永久token,--ttl 0:表示设置永不过期 (不安全,不推荐)
kubeadm token create --ttl 0

//方式二:生成临时token,有效期为一天 (可以保证集群安全性,推荐)
kubeadm token create

//查看生成的token
kubeadm token list



6.1.2、获取ca证书的sha256编码hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'


6.1.3、组装生成有效的 kubeadm join命令

通过新生成的 token 和 ca证书sha256编码的hash值 重新组装得到有效的 kubeadm join命令

kubeadm join 192.168.198.145:6443 --token gzxm5g.z2n80zos0ior1ln8 \
    --discovery-token-ca-cert-hash sha256:9a39cca67b506c8c7b4e59bc9e8e934b1c779342ed159f2318ce9ca2533cf58f

6.2、如果master节点安装过程失败,重置kubeadm

kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/



                   如果有遇到不懂或者有问题时,可以扫描下方二维码,欢迎进群交流与分享,希望能够跟大家交流学习!

发布了77 篇原创文章 · 获赞 306 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/qq_39135287/article/details/104575561