Kubernetes(K8s)-k8s集群构建

一、环境准备

1. 机器环境

准备3台虚拟机环境,或者是3台阿里云服务器都可。
k8s-master01: 此机器用来安装k8s-master的操作环境
k8s-node01: 此机器用来安装k8s node节点的环境
k8s-node02: 此机器用来安装k8s node节点的环境

在这里插入图片描述

每台虚拟机的配置要求:

  • 节点CPU核数必须是 :>= 2核 ,否则k8s无法启动
  • 节点内存:原则1G即可,但是有可能出现镜像下载失败的问题,最好2G以上
  • DNS网络: 最好设置为本地网络连通的DNS,否则网络不通,无法下载一些镜像
  • linux内核: linux内核必须是 4 版本以上,因此必须把linux核心进行升级

虚拟机网段要和宿主机网段保持一致
master:192.168.66.10
node1:192.168.66.11
node2:192.168.66.12

在这里插入图片描述

修改DNS,8.8.8.8是google的,有的时候google的服务器会很卡,改成宿主机的DNS
以下是我的宿主机DNS地址:
在这里插入图片描述

ifconfig 查看网卡IP地址,然后修改对应网卡的配置文件
vi /etc/sysconfig/network-scripts/ifcfg-xxx
在这里插入图片描述

改完以后需要重启network服务 systemctl restart network
其他虚拟机一样修改DNS

2. 依赖环境(基础环境)

PS:注意以下操作都是针对每个节点

2.1 设置主机名和对应IP映射关系

#1、给每一台机器设置主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
#查看主机名
hostname

三台都需要改:

在这里插入图片描述

#配置IP host映射关系
vi /etc/hosts
192.168.66.10 k8s-master01
192.168.66.11 k8s-node01
192.168.66.12 k8s-node02

三台都需要改:

在这里插入图片描述

2.2 安装依赖环境(依赖软件)

#2、安装依赖环境,注意:每一台机器都需要安装此依赖环境
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git iproute lrzsz bash-completion tree bridgeutils unzip bind-utils gcc
  • conntrack:允许系统管理员(从用户空间)和内核空间之间交互
  • ntpdate:通过它可以和服务器同步时间,比如和阿里云服务器保持时间同步
  • ntp:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议
  • ipvsadm:linux内核默认支持LVS,要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadm。
    LVS:Linux Virtual Server,即Linux虚拟服务器,是一个虚拟的服务器集群系统
    IPVS是LVS项目的一部分,是一款运行在Linux kernel当中的4层负载均衡器,性能异常优秀。
  • ipset:iptables的扩展,允许创建地址的集合
  • jq:json,在命令模式下可以对json进行操作
  • iptables:防火墙组件
  • curl:命令行中利用URL进行数据或者文件传输
  • sysstat:linux性能监测工具
  • libseccomp:提供了linux内核系统调用的过滤机制
  • wget:从指定的URL下载文件
  • vim:vim是从 vi 发展出来的一个文本编辑器
  • net-tools:老版本Linux内核中配置网络功能的工具
  • git:Git
  • iproute:网络管理工具
  • lrzsz:lrzsz是一款在linux里可代替ftp上传和下载的程序。
  • bash-completion:linux命令自动补全
  • tree:Linux tree命令用于以树状图列出目录的内容。
  • bridgeutils:网桥工具
  • unzip:unzip为.zip压缩文件的解压缩程序。
  • bind-utils:bind-utils是bind软件提供的一组DNS工具包
  • gcc:GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序

所有节点都要安装:
在这里插入图片描述

2.3 安装iptables防火墙服务

#3、安装iptables,启动iptables,设置开机自启,清空iptables规则,保存当前规则到默认规则
# 关闭默认的防火墙
systemctl stop firewalld && systemctl disable firewalld
# 安装,启动,设置开机自启,清空iptables规则,保存当前规则到默认规则
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

PS:在上一步中已经安装了iptables
iptables基本概念深入理解
只有iptables rpm包的时候也能做nat filter等策略,写多少,生效多少,规则保存在内和缓冲区,重启失效,写入开机启动则永久生效。有iptables及iptables-service rpm包的时候可以启动iptables服务,启动服务后,会有默认配置(默认规则为INPUT链允许icmp和22端口的网络协议包通过,其他数据包均不能通过)在此默认配置上再自己手动增加再保存,再重启iptables服务来写入内核,永久生效,通过服务区管理防火墙规则。
在这里插入图片描述

2.4 关闭系统交换区和selinux

#4、关闭selinux
#关闭swap分区【虚拟内存】并且永久关闭虚拟内存
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#关闭selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
  • swapoff -a :swapoff命令用于关闭系统交换区,-a 表示将/etc/fstab文件中所有设置为swap的设备关闭
  • sed -i 直接对文本文件进行操作,sed入门详解教程
    sed -i ‘/ swap / s/^(.*)$/#\1/g’:匹配所有包含" swap “的行,如果该行以”(“开头,以”)"结尾,将这行用#注释
    sed -i ‘s/^SELINUX=.*/SELINUX=disabled/’:将文件中所有SELINUX=xxx…都变为SELINUX=disabled

Security-Enhanced Linux:简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。一文彻底明白linux中的selinux到底是什么

通过运行命令 setenforce 0 和 sed … 将 SELinux 设置为 permissive 模式可以有效的将其禁用。 这是允许容器访问主机文件系统所必须的,例如正常使用 pod 网络。 您必须这么做,直到 kubelet 做出升级支持 SELinux 为止。官方文档有说明
在这里插入图片描述

2.5 升级Linux内核为4.44版本

#5、升级Linux内核为4.44版本
#下载prm包
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
#安装内核
yum --enablerepo=elrepo-kernel install -y kernel-lt
#设置开机从新内核启动(安装并不代表会使用安装的新内核)
grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'
#注意:设置完内核后,需要重启服务器才会生效。
#查询内核
uname -r

在这里插入图片描述

在这里插入图片描述

设置完内核后,需要重启服务器才会生效。
在这里插入图片描述

在这里插入图片描述

2.6 调整内核参数

#6、调整内核参数,针对k8s
#这是一种写法,通过cat指令,将EOF包装的具体配置,输入到kubernetes.conf文件
cat > kubernetes.conf <<EOF		
net.bridge.bridge-nf-call-iptables=1        #开启bridge-nf,iptables对于网桥的操作生效
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1                   #启用ip转发功能
net.ipv4.tcp_tw_recycle=0               #禁用tcp加快超时回收
vm.swappiness=0							#禁止使用swap
vm.overcommit_memory=1					#物理内存是否需要检查,1表示不检查
vm.panic_on_oom=0						#0表示开启,内存溢出会触发OOM killer
fs.inotify.max_user_instances=8192		#每一个用户可创建的inotify instatnces的数量上限
fs.inotify.max_user_watches=1048576		#表示同一用户同时可以添加的watch数目
fs.file-max=52706963					#系统所有进程一共可以打开的文件数量
fs.nr_open=52706963						#单进程文件最大打开数量
net.ipv6.conf.all.disable_ipv6=1        #禁用整个系统所有接口的IPv6
net.netfilter.nf_conntrack_max=2310720  #iptables连接跟踪模块最大跟踪连接数
EOF

#将优化内核文件拷贝到/etc/sysctl.d/文件夹下,这样优化文件开机的时候能够被调用
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
#手动刷新,让优化文件立即生效
sysctl -p /etc/sysctl.d/kubernetes.conf

在这里插入图片描述

在这里插入图片描述

看到有个警告,不用管,因为netfilter有个组件内核没有加载,后面加载就可以了

2.7 调整系统临时区

#7、调整系统临时区 --- 如果已经设置时区,可略过
#设置系统时区为中国/上海
timedatectl set-timezone Asia/Shanghai
#将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

2.8 关闭系统不需要的服务

#8、关闭系统不需要的服务,提升k8s运行性能
systemctl stop postfix && systemctl disable postfix

postfix:邮件服务软件
在这里插入图片描述

2.9 设置系统日志服务(systemd-journald)

Journald是systemd引入的用于收集和存储日志数据的系统服务。
鸟哥的Linux私房菜:基础学习篇 第四版
Systemd日志管理服务:Journald以及重要配置选项
journald.conf 中文手册

#9、设置k8s日志保存方式
#1).创建保存日志的目录
mkdir /var/log/journal
#2).创建配置文件存放目录
mkdir /etc/systemd/journald.conf.d
#3).创建配置文件
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
Storage=persistent	      #日志数据持久化
Compress=yes		      #日志文件是否需要压缩
SyncIntervalSec=5m		  #向磁盘刷写日志文件的时间间隔
RateLimitInterval=30s	  #限制日志的生成速率 (设为零表示不作限制)
RateLimitBurst=1000       #表示在RateLimitInterval时间段内, 每个服务最多允许产生的日志数量(条数)
SystemMaxUse=10G          #控制日志最大可使用多少磁盘空间
SystemMaxFileSize=200M    #限制单个日志文件的最大体积, 到达此限制后日志文件将会自动滚动。
MaxRetentionSec=2week     #日志文件的最大保留期限
ForwardToSyslog=no        #表示是否将接收到的日志消息转发给传统的 syslog 守护进程
EOF

#4).重启systemd journald的配置
systemctl restart systemd-journald

在这里插入图片描述

2.10 调整单个进程能打开的最大文件数

#10、打开文件数调整 (可忽略,不执行)(使用默认即可可以不设置)
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf

nofile全称number of open files,单个进程能打开的最大文件数。
nofile是有一个上限的,由内核参数nr_open定义
Linux中soft nproc 、soft nofile和hard nproc以及hard nofile配置
Linux下设置最大文件打开数nofile及nr_open、file-max

2.11 内核加载br_netfilter、ipvs模块

#11、kube-proxy 开启 ipvs 前置条件,确保内核加载ipvs模块
#(ipvs称之为IP虚拟服务器)
modprobe br_netfilter    #加载网桥防火墙模块

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
##使用lsmod命令查看这些文件是否被引导
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
  • modprobe:用于向内核中加载模块或者从内核中移除模块。
    modprobe -r:移除
  • chmod 755 /etc/sysconfig/modules/ipvs.modules:使脚本具有执行权限
  • bash /etc/sysconfig/modules/ipvs.modules:使用bash命令执行shell脚本
  • lsmod | grep -e ip_vs -e nf_conntrack_ipv4:使用lsmod命令查看已加载的模块

在这里插入图片描述

3. docker部署(docker环境)

3.1 安装docker

#1、安装docker
# yum-util 提供yum-config-manager功能,其他两个是Docker存储驱动devicemapper依赖的
# Device Mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,
# 在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略
# Docker的devicemapper存储驱动程序利用此框架的精简配置和快照功能进行镜像和容器管理
yum install -y yum-utils device-mapper-persistent-data lvm2

#设置yum源为阿里云,仓库配置会保存到/etc/yum.repos.d/docker-ce.repo文件中
yum-config-manager --add-repo http://mirrors.aliyun.com/docker‐ce/linux/centos/docker‐ce.repo

#更新Yum安装的相关Docke软件包&安装Docker CE(社区版)docker-ee(企业版)
yum update -y && yum install docker-ce

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.2 设置docker daemon文件

#2、设置docker daemon文件
#创建/etc/docker目录
mkdir /etc/docker
#更新daemon.json文件
cat > /etc/docker/daemon.json <<EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","logopts": {"max-size": "100m"}}
EOF
#"json-file":以json格式记录日志,max-size:日志文件最大大小
#注意: 一定注意编码问题,出现错误:查看命令:journalctl -amu docker 即可发现错误

#为 docker 服务创建一个 systemd 放置目录
mkdir -p /etc/systemd/system/docker.service.d

#3、重新加载 systemd 程序的配置文件、重启docker服务、设置开机启动
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

4. 安装kubeadm[一键安装k8s]

k8s有三种安装方式

  • 二进制安装方式,很麻烦每个组件软件都要下载安装,k8s里面有很多组件很麻烦
  • 使用kubeadm安装,可以一键式安装,官网推荐
  • 可视化界面安装

kubernetes官网文档
Kubeadm官方文档
安装 kubeadm
在这里插入图片描述

在这里插入图片描述
上文的机器环境、依赖环境其实大部分都是按照官方要求进行的配置。
接下来的操作也是按照官方文档来的

3.1 设置阿里云的k8s yum仓库

#1、安装kubernetes的时候,需要安装kubelet, kubeadm等包,但k8s官网给的yum源是packages.cloud.google.com,国内访问不了,此时我们可以使用阿里云的yum仓库镜像。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 #指定镜像地址aliyun的
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

阿里云官方镜像站
阿里云Kubernetes 镜像
yum的repo文件详解、以及epel简介、yum源的更换

  • [serverid]:其中serverid是用于区别各个不同的repository,必须有一个独一无二的名称。 重复了后面覆盖前面的
  • name,是对repository的描述
  • baseurl是服务器设置中最重要的部分,只有设置正确,才能从上面获取软件
  • enabled=[1 or 0]:当某个软件仓库被配置成 enabled=0 时,yum 在安装或升级软件包时不会将该仓库做为软件包提供源。使用这个选项,可以启用或禁用软件仓库。
  • gpgcheck:这个选项表示这个repo中下载的rpm将进行gpg的校验,以确定rpm包的来源是有效和安全

3.2 安装kubeadm、kubelet 和 kubectl

#2、安装kubeadm、kubelet、kubectl
yum install -y kubeadm-1.15.1 kubelet-1.15.1 kubectl-1.15.1
# 启动 kubelet
systemctl enable kubelet && systemctl start kubelet
  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

在这里插入图片描述

在这里插入图片描述

二、集群构建

现在开始正式构建集群:使用kubeadm创建集群 官方文档

1. 本地下载依赖镜像

kubeadm config images list:展示安装K8s需要依赖哪些镜像(依赖的核心组件):
在这里插入图片描述
这些镜像需要从网络上下载,国外地址可能会下载失败(如果你的网络没问题可以忽略这一步)
可以使用docker pull + 镜像名,从阿里云的镜像仓库一个一个下载到本地
我本地有一个镜像的压缩包,直接本地上传
在这里插入图片描述

在这里插入图片描述
可以使用docker load -i 手动导入tar包镜像到本地仓库,但是镜像比较多,而且每个节点都要做,所以我们创建脚本文件:

编写脚本,通过脚本导入镜像包到本地docker镜像仓库,创建image-load.sh文件:

#1、导入镜像脚本代码
#注意 镜像解压的目录位置

#!/bin/bash
ls /root/kubeadm-basic.images > /tmp/images-list.txt
cd /root/kubeadm-basic.images
for i in $(cat /tmp/images-list.txt)
do
	docker load -i $i
done
rm -rf /tmp/images-list.txt
  • ls 镜像解压目录:可以展示该目录下所有镜像名称,然后输入到/tmp/images-list.txt临时文件中
  • cd 镜像解压目录:进入到该目录下
  • for循环,从/tmp/images-list.txt文件中获取打包到名称,赋值给i变量
    循环执行 docker load -i 指令
  • 结束后删除/tmp/images-list.txt临时文件

在这里插入图片描述

#2、赋予可执行权限
chmod 755 image-load.sh

#3、开始执行,镜像导入
./image-load.sh

在这里插入图片描述

查看是否导入成功:
在这里插入图片描述

#4、传输脚本文件及镜像到其他node节点
#拷贝到node01节点
scp -r image-load.sh kubeadm-basic.images root@k8s-node01:/root/
#拷贝到node02节点
scp -r image-load.sh kubeadm-basic.images root@k8s-node02:/root/

#其他节点依次执行sh脚本,导入镜像

在这里插入图片描述

2. 初始化控制平面节点(创建master节点)

此步骤,所有操作只需要在主节点执行
kubeadm init to bootstrap a Kubernetes control-plane node
官方文档:kubeadm init

2.1 修改默认配置文件

官方文档:kubeadm config
官方文档:Using kubeadm init with a configuration file

#初始化主节点 --- 只需要在主节点执行
#1、将默认的配置输出到kubeadm-config.yaml文件
kubeadm config print init-defaults > kubeadm-config.yaml

在这里插入图片描述

#2、修改yaml资源文件
vi kubeadm-config.yaml

只列我们需要关注的部分:

更多配置参考:https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm

localAPIEndpoint:
	advertiseAddress: 192.168.66.10 # 注意:修改配置文件的IP地址,此地址要改为master节点地址
kubernetesVersion: v1.15.1 #注意:修改版本号,必须和kubectl版本保持一致
networking:
	# 指定flannel模型通信 pod网段地址,此网段和flannel网段一致
	podSubnet: "10.244.0.0/16"
	serviceSubnet: "10.96.0.0/12"

...
#指定使用ipvs网络进行通信(这段配置需要追加)
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: kubeProxyConfiguration
featureGates:
	SupportIPVSProxyMode: true
mode: ipvs
  • ServiceSubnet是k8s services使用的子网。默认为“10.96.0.0/12”。
  • podSubnet是pods使用的子网。

Kubernetes 当中启用IPVS模式

在这里插入图片描述

修改版本号、配置pod的网段:
在这里插入图片描述

指定使用ipvs网络进行通信,这段配置需要追加:
在这里插入图片描述

2.2 使用配置文件初始化控制平面节点

#3、初始化主节点,开始部署
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
#日志会写入到kubeadm-init.log
#注意:执行此命令,CPU核心数量必须大于1核,否则无法执行成功
  • –experimental-upload-certs:可以将控制平面证书临时上传到集群中的 Secret。 请注意,此 Secret 将在 2 小时后自动过期。
    V1.16以后需要将–experimental-upload-certs 替换为 --upload-certs

在这里插入图片描述

在这里插入图片描述

kubernetes主节点初始化成功,按照上图提示还需要三个步骤,首先看第一个步骤,要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init 输出的一部分:

#4、初始化成功后执行如下命令
#创建目录,保存连接配置缓存,认证文件
mkdir -p $HOME/.kube
#拷贝集群管理配置文件
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#授权给配置文件
chown $(id -u):$(id -g) $HOME/.kube/config

或者,如果你是 root 用户,则可以运行:

export KUBECONFIG=/etc/kubernetes/admin.conf

在这里插入图片描述
如图执行完这三条命令后就可以使用kubectl命令了

我们发现已经可以成功查询node节点信息了,但是节点的状态却是NotReady,不是Runing的状态。原因是此时我们使用ipvs+flannel的方式进行网络通信,但是flannel网络插件还没有部署,因此节点状态此时为NotReady

在这里插入图片描述

3. 使用flannel部署pod网络

官方文档:集群网络系统
有很多种方式可以实现k8s的网络模型,这里我们使用flannel

在这里插入图片描述

#部署flannel网络插件 --- 只需要在主节点执行
#1、直接使用官方提供的yml文件实现快速部署
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kubeflannel.yml

#2、部署flannel
kubectl create -f kube-flannel.yml

#也可进行网络部署
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kubeflannel.yml

在这里插入图片描述
虽然提示created,但是后台可能还在下载,需要等待一段时间

在这里插入图片描述

再次查看node状态,已经是Ready状态了
在这里插入图片描述

到此master节点已经安装成功

4. 将新节点添加到集群

查看之前初始化控制平面节点的日志:

在这里插入图片描述
在这里插入图片描述

最后一个步骤,可以在新节点下执行该命令让其加入到集群中:

# 加入主节点以及其余工作节点,执行安装日志中的命令即可
#查看日志文件
cat kubeadm-init.log
# 负责命令到其他几个node节点进行执行即可
kubeadm join 192.168.66.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash
sha256:6d8aad1451c1303ee52aada4ea2351e8c8d64863b074628586535d0d369ca2c2

在这里插入图片描述
在这里插入图片描述

执行成功后在master节点上执行命令查看节点状态:
在这里插入图片描述
发现还有一些节点处于NotReady状态,是因为这些节点pod容器还处于初始化的状态,需要等一点时间。

到此集群搭建成功,而且这个集群开机就会自动启动

简单介绍一些指令:
kubectl get pod -n kube-system
在这里插入图片描述

k8s所有资源都是通过镜像方式部署的,运行的模式就是通过pod
以上pod都是k8s系统的pod,系统资源的pod,相当于一个操作系统一样,k8s就是操作系统
操作系统有一些系统资源,k8s的系统资源就在-n 指定的命名空间下

在这里插入图片描述
这种部署模式就是damonset

可以看到kube-proxy组件(服务发现、路由规则的设置)三个节点都有
scheduler(调度的)、apiserver(网关)、etcd(存储配置信息、集群状态信息 )、coredns(dns用来做服务名的解析,解析成ip地址,通过服务名的方式和pod、容器通信)是属于master节点的

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐