文章目录
kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验kubeadm可以学习到Kubernetes官方在集群配置上一些新的最佳实践。
在Kubernetes的文档Creating a single master cluster with kubeadm中已经给出了目前kubeadm的主要特性已经处于beta状态了,在2018年将进入GA状态,说明kubeadm离可以在生产环境中使用的距离越来越近了。
下面我将介绍一下kubeadm的安装,比起k8s的二进制安装方式,kubeadm的安装门槛较低,更容易上手。
1. 准备工作
1.1 机器准备
准备三台Centos7.x虚拟机,具体配置如下:
IP | Role | CPU | Memory | Hostname |
---|---|---|---|---|
192.168.199.231 | master | >= 2C | >= 2G | master |
192.168.199.232 | worker | >= 2C | >= 2G | node1 |
192.168.199.233 | worker | >= 2C | >= 2G | node1 |
IP 根据你自己宿主机机器网段决定。
1.2 系统配置
1.2.1 主机名及域名解析
# 192.168.199.231上执行
hostnamectl set-hostname master
# 192.168.199.232上执行
hostnamectl set-hostname node1
# 192.168.199.233上执行
hostnamectl set-hostname node2
# 192.168.199.231、192.168.199.232、192.168.199.233三台都执行
cat <<EOF>>/etc/hosts
192.168.199.231 master
192.168.199.232 node1
192.168.199.233 node2
EOF
设置完后,相互ping一下看看网络是否通。如:ping node1
1.2.2 免密登录
设置 master 可以无密码登录所有节点的 root 账户:
## 第一步:在master节点执行,一路回车到底
ssh-keygen -t rsa
## 第二步:在master节点执行以下三句,然后分别输入对应机器登录密码
ssh-copy-id root@master
ssh-copy-id root@node1
ssh-copy-id root@node2
1.2.3 配置yum源
注意:所有虚拟机都需要执行下面的操作
配置阿里软件源(base和epel):
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
最后一句记得回车,配置完过后,可通过命令:
yum repolist
来查看是否配置成功。如果出现如下信息则表示成功:
- base: mirrors.aliyun.com
- extras: mirrors.aliyun.com
- updates: mirrors.aliyun.com
配置国内Kubernetes源:
cat <<EOF > /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=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
配置docker源:
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
执行清理和更新:
yum clean all && yum makecache && yum update -y # 第一次需要比较久的时间,去喝杯水休息休息
1.2.4 安装必要依赖包
在三台机器上执行命令:
yum install -y epel-release
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
/usr/sbin/modprobe ip_vs # 这一句记得回车
ipvs 依赖 ipset
ntp 保证各机器系统时间同步;
1.2.5 关闭防火墙、SELinux、Swap分区
注意:所有虚拟机都需要执行下面的操作
关闭防火墙:
systemctl stop firewalld &&
systemctl disable firewalld &&
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat &&
iptables -P FORWARD ACCEPT
关闭SELinux:
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
关闭Swap分区:
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
1.2.6 配置内核参数
注意:所有虚拟机都需要执行下面的操作
将桥接的IPv4流量传递到iptables的链,swappiness参数调整:
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
EOF
modprobe ip_vs_rr
modprobe br_netfilter
sysctl --system # 记得回车
2. 安装Docker
2.1 安装
Kubernetes从1.6开始使用CRI(Container Runtime Interface)容器运行时接口。默认的容器运行时仍然是Docker,使用的是kubelet中内置dockershim CRI实现。
查看版本:
# 查看docker版本
yum list docker-ce.x86_64 --showduplicates | sort -r
# 查看docker cli版本
yum list docker-ce-cli.x86_64 --showduplicates |sort -r
Kubernetes 1.15已经针对Docker的1.13.1, 17.03, 17.06, 17.09, 18.06,18.09等版本做了验证,需要注意Kubernetes 1.15最低支持的Docker版本是1.13.1。 我们这里在各节点安装docker的19.03.9版本。
# 安装docker、docker-cli
yum install -y docker-ce-19.03.9-3.el7 docker-ce-cli-19.03.9-3.el7
# 开机启动 && 启动docker
systemctl enable docker && systemctl start docker
# 查看版本
docker --version
安装docker还可以通过脚本,详情见:https://leisure.wang/procedural-framework/docker/112.html
2.2 配置镜像加速
# 第一步:创建目录(不存在则创建)
mkdir -p /etc/docker
# 第二步:创建并配置daemon.json文件
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}
EOF
# 第三步:重新加载配置并重启docker
systemctl daemon-reload && systemctl restart docker
确认一下iptables filter表中FOWARD链的默认策略(pllicy)为ACCEPT:
# 命令
iptables -nvL
# 结果部分如下:
Chain INPUT (policy ACCEPT 321 packets, 18442 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
3. 使用kubeadm部署k8s集群
3.1 安装kubeadm、kubelet、kubectl
需要在每台机器上都安装以下的软件包:
- Kubelet:负责与其他节点集群通信,并进行本节点Pod和容器生命周期的管理。
- Kubeadm:是Kubernetes的自动化部署工具,降低了部署难度,提高效率。
- Kubectl:是Kubernetes集群管理工具。
查看可用版本:
yum list --showduplicates | grep 'kubeadm\|kubectl\|kubelet'
选择安装kubeadm1.18.0、kubelet1.18.0、kubectl1.18.0
# 安装
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 --disableexcludes=kubernetes
# 此时还不能启动kubelet,先设置开机启动
systemctl enable --now kubelet
从安装结果可以看出还安装了cri-tools, kubernetes-cni, socat三个依赖:
- socat是kubelet的依赖
- cri-tools是CRI(Container Runtime Interface)容器运行时接口的命令行工具
运行kubelet –help可以看到原来kubelet的绝大多数命令行flag参数都被DEPRECATED了。
而官方推荐我们使用–config指定配置文件,并在配置文件中指定原来这些flag所配置的内容。具体内容可以查看这里Set Kubelet parameters via a config file。这也是Kubernetes为了支持动态Kubelet配置(Dynamic Kubelet Configuration)才这么做的,参考Reconfigure a Node’s Kubelet in a Live Cluster。
kubelet的配置文件必须是json或yaml格式,具体可查看这里。
3.2 配置kubeadm
查看kubelet安装了哪些文件:
# 命令
rpm -ql kubelet
# 结果
/