【02】Kubernets:使用 kubeadm 部署 K8S 集群
写在前面的话
通过上一节,知道了 K8S 有 Master / Node 组成,但是具体怎么个组成法,就是这一节具体谈的内容。概念性的东西我们会尽量以实验的形式将其复现。
部署 K8S 集群
互联网常用的 K8S 集群部署方式:
1. kubeadm(我们本次用到的)
2. rancher
3. 云服务商提供的(如阿里云提供的 K8S)
4. yum 安装(版本有点低,不推荐)
准备:
| IP | 主机名 | 角色 | 安装 |
|---|---|---|---|
| 192.168.100.101 | node1 | Master | kubeadm/kubelet/kubectl/docker-ce/flannel |
| 192.168.100.102 | node2 | Node | kubeadm/kubelet/kubectl/docker-ce/flannel |
| 192.168.100.103 | node3 | Node | kubeadm/kubelet/kubectl/docker-ce/flannel |
准备 3 台初始化的机器,内存大于 2G。
至于 kubeadm 文档如下,感兴趣的可以去看看:
https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md
【1】所有节点初始化操作:
# 配置主机名解析
echo "192.168.100.101 node1" >>/etc/hosts
echo "192.168.100.102 node2" >>/etc/hosts
echo "192.168.100.103 node3" >>/etc/hosts # 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld # 取消 swap
swapoff -a # 配置 ipvs
echo 'net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1' > /etc/sysctl.d/k8s.conf # 使配置生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf # kube-proxy 配置 ipvs
echo 'modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4' >> /etc/sysconfig/modules/ipvs.modules # 生效配置
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 # 时间同步
yum -y install ntpdate
ntpdate cn.pool.ntp.org
echo "*/20 * * * * /usr/sbin/ntpdate cn.pool.ntp.org" >> /var/spool/cron/root
简单的做个说明,上面的步骤是每个节点都需要进行的初始化操作,属于必须进行了。第一个主机名解析需要根据自己的实际情况进行一定量的修改。关闭防火墙是为了保证我们的通信能够正常完成。至于开启 ipvs 我们在上一节提到过,在 K8S 1.11 版本以后,系统的负载均衡调度选用的是 ipvs 规则,能够提高我们集群的性能。如果你不配置 ipvs,可能还会使用 iptables 规则,这不是我们想要看到的。
值得注意的是,时间同步在 docker 和 K8S 集群中都特别重要,所以一定要保证时间与互联网时间同步,否则可能导致莫名其妙的 BUG,如:镜像拉取失败,报错:
x509: certificate has expired or is not yet valid
【2】所有节点都安装配置 docker:
# 卸载旧版本
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2 bridge-utils bash-completion wget # 配置阿里 yum 源
cd /etc/yum.repos.d
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装 docker
yum -y install docker-ce
配置 docker 阿里云下载加速:(这里的加速地址是网友的,如果你想用自己的,可以去阿里云搞一个,具体就不详细说明了,网上很多)
mkdir -p /etc/docker
echo '{
"registry-mirrors": ["https://eyg9yi6d.mirror.aliyuncs.com"]
}' > /etc/docker/daemon.json
启动 docker:
systemctl enable docker
systemctl start docker
docker version
我这里 docker 版本为: 18.09.6

【3】所有节点都配置 K8S 源并安装 K8S:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
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
安装 K8S 并设置开机启动,但是先不启动:
yum makecache fast
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
我们这里安装 K8S 版本为:v1.14.2
【4】节点下载镜像:
由于国内网络的原因,K8S 的镜像站是连接不上的,需要手动去下载,这里有个我写的脚本,修改成你的 K8S 版本就行(K8S_VERSION):
#!/bin/bash #################################################################
# 作者:Dy1an <1214966109@qq.com>
# 日期:2019-05-23
# 作用:下载 K8S 相关镜像
################################################################# #################################################################
# 系统相关变量
#################################################################
LINE="==================================================================="
MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/openthings
K8S_VERSION="v1.14.2" #################################################################
# 拉取镜像
#################################################################
echo ${LINE}
echo "Pull Kubernetes ${K8S_VERSION} Images from aliyuncs.com ......"
echo ${LINE}
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:${K8S_VERSION}
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:${K8S_VERSION}
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:${K8S_VERSION}
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:${K8S_VERSION}
docker pull ${MY_REGISTRY}/k8s-gcr-io-etcd:3.3.10
docker pull ${MY_REGISTRY}/k8s-gcr-io-pause:3.1
docker pull ${MY_REGISTRY}/k8s-gcr-io-coredns:1.3.1 #################################################################
# 修改 tag
#################################################################
echo ${LINE}
echo "Change Kubernetes ${K8S_VERSION} Images tags ......"
echo ${LINE}
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:${K8S_VERSION} k8s.gcr.io/kube-apiserver:${K8S_VERSION}
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:${K8S_VERSION} k8s.gcr.io/kube-scheduler:${K8S_VERSION}
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:${K8S_VERSION} k8s.gcr.io/kube-controller-manager:${K8S_VERSION}
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:${K8S_VERSION} k8s.gcr.io/kube-proxy:${K8S_VERSION}
docker tag ${MY_REGISTRY}/k8s-gcr-io-etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag ${MY_REGISTRY}/k8s-gcr-io-pause:3.1 k8s.gcr.io/pause:3.1
docker tag ${MY_REGISTRY}/k8s-gcr-io-coredns:1.3.1 k8s.gcr.io/coredns:1.3.1 #################################################################
# 提示完成
#################################################################
echo ${LINE}
echo "Pull Kubernetes ${K8S_VERSION} Images FINISHED."
echo ${LINE}
在每台机器上面执行脚本,下载完成后查看镜像:
docker images
结果如图:

【5】Master 主节点初始化:
在初始化之前,我们需要插播一个知识点,那就是 K8S 网络,先看个图:

在 K8S 集群中,我们主要会提到 3 个网络:
1. 节点网络:很好理解,就是每台机器的真实 IP 地址,比如:192.168.100.101,该 IP 称作 Node IP。
2. Pod 网络:K8S 管理的最小单位是 Pod,我们可以把 Pod 就看成一个 docker 容器,这个 IP 就像容器的 IP,称作 Pod IP。
3. Service 网络:前两 IP 都会配置到 Pod 或网卡,但是这个不会,若多个 Pod 组成一个 Service,这个 IP 就像统一入口。至于 Service,之后会详讲。该 IP 称作 Cluster IP。
当然还有其他网络,比如 pod 和 pod 之间通信的隧道 Overlay(叠加)网络。以及 Pod 内部容器间通过 lo 网卡通信的网络。这些都不需要我们去关注。只需要记住上面的 3 个就行。
为了实现这样复杂的网络结构,我们引入了网络插件,常见的插件有以下几种:
1. flannel:简单易用,但不支持网络策略。通过配置本地网络协议栈实现给本机 Pod 配置 IP。
2. project calico:支持网络策略和网络配置,默认基于 BGP 网络实现直接通信。
3. canel:flannel 和 calico 结合,flannel 提供网络,calico 提供策略。
基于上面的知识点,我们再来初始化我们的集群,并定义了两个服务网段:
# 添加配置
echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet # 初始化主节点
kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.1.0.0/16 --service-cidr=10.96.0.0/12
结果如图:

从初始化节点打印的东西我们可以看到:
1. 系统初始化安装了两个附件:kube-proxy 和 CoreDNS(就是 kube-dns)。
2. 我们需要手动执行这个 3 个命令才算真正完成主节点初始化。
3. Node 节点加入集群的命令,需要我们记录下来。
执行后续操作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看集群状态:
kubectl get cs
结果如图:

查看节点信息:
kubectl get nodes
结果如图:

此时可以看到,主节点的状态是 NotReady 的,原因是还没有配置 flannel。
注意:如果出现错误,我们可以通过 /var/log/messages 查看日志。
安装 flannel 网络插件,项目地址:
https://github.com/coreos/flannel
执行命令在线安装:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
结果如图:

此时再度查看节点状态:
kubectl get nodes
结果如图,已经变成 Ready 状态:

查看当前运行的 Pod:
kubectl get pods -n kube-system
结果如图:

这里专门指定了名称空间,如果不指定,会发现默认的名称空间中什么也没有。可以查看下名称空间:
kubectl get ns
结果如图:

至此,主节点配置基本完成,接下来配置 Node 节点!至于这些命令,之后会单独讲解。
【6】Node 节点初始化:
# 添加配置
echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet # 加入集群
kubeadm join 192.168.100.101:6443 --token no4hr8.4xv9xjyt9dxwqinq --discovery-token-ca-cert-hash sha256:239675f2ccb9e700ea1a60b8ff019672ea1a98c1f66ad6a81972cb5ec7d4f381
结果如图:

去主节点查看结果:容器启动需要一定的时间(1-2分钟),所以直接查看可能出现 NotReady 的情况,这是正常的。

主节点上查看运行的详细信息:
kubectl get pods -n kube-system -o wide
结果如图:-o wide 查看详细信息!

可以看到,kube-proxy 和 kube-flannel 在其他节点上都有运行。
这里我们得再强调一件事情,除了开始加入节点的命令我们得去 Node 从节点执行,后续的命令我们都是在 Master 节点完成的,由此可以看出 Master 节点的重要性。
到此,K8S 简单的集群搭建完成!
小结
整个部署过程中最麻烦的就是镜像下载以及镜像版本之间的兼容性。我们推荐使用相对成熟的版本部署我们的应用。因为我这里是测试,所以就选用的最新稳定版。
主要的过程就像这些,看着很复杂,其实大多都说贴命令的过程。后续如果感兴趣,其实完全可以写成脚本,让他一键部署。
【02】Kubernets:使用 kubeadm 部署 K8S 集群的更多相关文章
- 使用kubeadm部署k8s集群[v1.18.0]
使用kubeadm部署k8s集群 环境 IP地址 主机名 节点 10.0.0.63 k8s-master1 master1 10.0.0.63 k8s-master2 master2 10.0.0.6 ...
- (二)Kubernetes kubeadm部署k8s集群
kubeadm介绍 kubeadm是Kubernetes项目自带的及集群构建工具,负责执行构建一个最小化的可用集群以及将其启动等的必要基本步骤,kubeadm是Kubernetes集群全生命周期的管理 ...
- kubeadm部署k8s集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 kubeadm ini ...
- kubeadm部署K8S集群v1.16.3
本次先更新kubeadm快速安装K8S,二进制安装上次没写文档,后续更新,此次最新的版本是V1.16.3 1.关闭防火墙.关闭selinux.关闭swapoff -a systemctl stop f ...
- kubernetes系列03—kubeadm安装部署K8S集群
本文收录在容器技术学习系列文章总目录 1.kubernetes安装介绍 1.1 K8S架构图 1.2 K8S搭建安装示意图 1.3 安装kubernetes方法 1.3.1 方法1:使用kubeadm ...
- 使用Kubeadm创建k8s集群之部署规划(三十)
前言 上一篇我们讲述了使用Kubectl管理k8s集群,那么接下来,我们将使用kubeadm来启动k8s集群. 部署k8s集群存在一定的挑战,尤其是部署高可用的k8s集群更是颇为复杂(后续会讲).因此 ...
- 使用Kubeadm创建k8s集群之节点部署(三十一)
前言 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案.不 ...
- 通过kubeadm工具部署k8s集群
1.概述 kubeadm是一工具箱,通过kubeadm工具,可以快速的创建一个最小的.可用的,并且符合最佳实践的k8s集群. 本文档介绍如何通过kubeadm工具快速部署一个k8s集群. 2.主机规划 ...
- 二进制方法-部署k8s集群部署1.18版本
二进制方法-部署k8s集群部署1.18版本 1. 前置知识点 1.1 生产环境可部署kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式 kuberadm Kubea ...
随机推荐
- 利用Python调用pastebin.com API自动创建paste
在上一篇文章中,已经实现了模拟pastebin.com的账号登录,并且获取了api_dev_key,这一篇文章主要讲一下调用API创建paste 登录之后,进入API页面,发现网站已经提供了几个API ...
- bat脚本弹出消息示例(msg命令详细解释)
弹出消息的bat,其实就是通过批处理调用msg命令,msg是系统自在的一个可以发送信息的命令. 示例: @echo off rem 测试MSG msg * "ok" rem 测试M ...
- modbus_tk模块
modbus_tk模块 通过modbus-RTU 读取地址,调用后返回反馈数值和故障信息. modbus_tk模块安装 pip install pymodbus_tk 下面代码功能:读取地址为0x42 ...
- 五、select的5种子句
1.Where 条件查询 比较运算符: 运算符 说明 > < = >= <= !=或<> In 在某集合内 between 在某范围内 In ...
- JAVAWEB复习笔记-day02
1.CSS样式优先级 优先级:由上到下,由外到内.优先级越来越高 2.css选择器 html标签选择器 class选择器(.) id选择器(#) 3.优先级 style属性>id选择器>c ...
- 继承c3,网络编程,相互通信
继承: 面向对象多继承,a先找左,再找右 py2中有经典类,新式类,py3中只有新式类 py2中用ascii 编译 py3中用unicode 编译 py2: 经典类 新式类:如果自己或自己的前辈继承o ...
- 201777010217-金云馨《面向对象程序设计(Java)》第十二周学习总结
内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...
- Spring Boot2.0+中,自定义配置类扩展springMVC的功能
在spring boot1.0+,我们可以使用WebMvcConfigurerAdapter来扩展springMVC的功能,其中自定义的拦截器并不会拦截静态资源(js.css等). @Configur ...
- spring中@Param和mybatis中@Param使用区别(暂时还没接触)
1.spring中@Param(org.springframework.data.repository.query.Param) int selectRoleCount(@Param("bu ...
- options模块介绍
一. options是什么? 是tornado中为我们提供好的一个模块. 二. options的作用? 用来定义, 存储, 转换全局参数. 即定义变量 三. options如何使用? import t ...