还不会K8S吗?先从kubeadm开始吧


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

# 结果
/
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值