【02】Kubernets:使用 kubeadm 部署 K8S 集群

写在前面的话

 

通过上一节,知道了 K8S 有 Master / Node 组成,但是具体怎么个组成法,就是这一节具体谈的内容。概念性的东西我们会尽量以实验的形式将其复现。

 

 

部署 K8S 集群

 

互联网常用的 K8S 集群部署方式:

1. kubeadm(我们本次用到的)

2. rancher

3. 云服务商提供的(如阿里云提供的 K8S)

4. yum 安装(版本有点低,不推荐)

 

准备:

IP主机名角色安装
192.168.100.101node1Masterkubeadm/kubelet/kubectl/docker-ce/flannel
192.168.100.102node2Nodekubeadm/kubelet/kubectl/docker-ce/flannel
192.168.100.103node3Nodekubeadm/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-proxyCoreDNS(就是 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-proxykube-flannel 在其他节点上都有运行。

这里我们得再强调一件事情,除了开始加入节点的命令我们得去 Node 从节点执行,后续的命令我们都是在 Master 节点完成的,由此可以看出 Master 节点的重要性。

到此,K8S 简单的集群搭建完成! 

 

 

小结

 

整个部署过程中最麻烦的就是镜像下载以及镜像版本之间的兼容性。我们推荐使用相对成熟的版本部署我们的应用。因为我这里是测试,所以就选用的最新稳定版。

主要的过程就像这些,看着很复杂,其实大多都说贴命令的过程。后续如果感兴趣,其实完全可以写成脚本,让他一键部署。

转载于:https://www.cnblogs.com/Dy1an/p/10812263.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建一个文本搜索系统

说明&#xff1a;文章内容来源于课程视频和课程ppt。我只学习了课程没有做习题。文章不是翻译&#xff0c;是我对课程的理解。 1 TR的主要构成 在文章中文本检索系统全文检索系统TR System  从图中看到(红色的方框)TR的主要过程有&#xff1a;分词(Tokenizer)、索引(Indexer)…

[Linux][Ubuntu]Linux实习常用操作/Debug总结

一、 Win下装Jupter 1.安装anaconda 配置环境变量 打开jupyter 2.切换目录 装软件 二、 移动复制粘贴上锁文件 sudo nautilus 三、 视频播放 sudo nano /etc/environment 添加QT_X11_NO_MITSHM1 四、 修改阿里源 提高下载速度 1.1打开software&updates 1.2 打…

第二十六期:100 个网络基础知识普及,看完成半个网络高手

本篇文章是关于100个网络基础知识普及&#xff0c;看完成半个网络高手!下面&#xff0c;我们一起来看。 作者&#xff1a;佚名来源 本篇文章是关于100个网络基础知识普及&#xff0c;看完成半个网络高手!下面&#xff0c;我们一起来看。 1)什么是链接? 链接是指两个设备之间…

团队冲刺第一天

今天要做什么&#xff1a;每个人都在网上学习Android软件开发的知识&#xff0c;完成简单的操作&#xff0c;实现简单功能。 明天要做什么&#xff1a;学习各种控件的作用&#xff0c;用法 站立会议照片&#xff1a; 任务看板照片&#xff1a; 燃尽图&#xff1a; 转载于:https…

[Leetcode][第679题][JAVA][24点游戏][回溯][暴力]

【问题描述】[困难] 【解答思路】 回溯 时间复杂度&#xff1a;O(1) 空间复杂度&#xff1a;O(1) class Solution {static final int TARGET 24;static final double EPSILON 1e-6;static final int ADD 0,MULTIPLY1,SUBTRACT 2,DIVIDE 3;public boolean judgePoint24(int…

第二十七期:网络爬虫程序员被抓,我们还敢爬虫吗?细数那些Java爬虫技术

最近&#xff0c;某大数据科技公司因为涉嫌非法抓取某招聘网站用户的简历信息&#xff0c;公司被查封&#xff0c;负责编写抓取程序的程序员也将面临坐牢。 作者&#xff1a;架构之路来源 最近&#xff0c;某大数据科技公司因为涉嫌非法抓取某招聘网站用户的简历信息&#xff…

文本搜索系统的评估

说明&#xff1a;文章内容来源于课程视频和课程ppt。我只学习了课程没有做习题。文章不是翻译&#xff0c;是我对课程的理解。  这部分本应该继续说反馈(FeedBack)的。但是课程中安排的是评估(Evaluation)。评估是用于衡量搜索引擎质量的。反馈是为了提高搜索引擎质量而进行的…

UE3客户端服务器GamePlay框架

客户端(当前玩家)与服务器对应关系图&#xff1a; 整体上看&#xff0c;UE3的GamePlay框架使用的是MVC架构 ① 橙色的Actor对象及橙色箭头相连的成员变量只会被同步给Owner客户端 Controller&#xff1a;控制器&#xff0c;包括PlayerController和AIController InventoryManage…

[Leetcode][第201题][JAVA][数字范围按位与][位运算][Brian Kernighan]

【问题描述】[中等] 【解答思路】 1. 暴力 逐位与 &#xff0c;只需要判断i 0 或 i 2147483647 的话&#xff0c;就跳出 for 循环即可。 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) public int rangeBitwiseAnd(int m, int n) {//m 要赋值给 i&#xff0c;所…

OIS协议分层

OSI参考模型将通讯协议中必要的功能分成了7层&#xff0c;通过分层&#xff0c;使那些比较复杂的网络协议更加简单化。在这一模型中&#xff0c;每个分层都接受由它下一层所提供的特定服务&#xff0c;并且负责为自己的上一层提供特定的服务。上下层之间进行交互时所遵循的约定…

文档排序模型--查询似然Query Likelihood

在概率模型中&#xff0c;我们定义排序函数是基于文档与查询之间的相关度、可能性来做的。f(d,q) p(R1|d,q), R ∈{0,1}。概率模型有几个小分类&#xff1a;   经典概率模型——>BM25   语言模型Language Model —–>Query Likelihood   Divergence from rando…

第五十二期:甲骨文遭遇“中年危机”:继阿里后,再被亚马逊永久抛弃

42岁的甲骨文迎来“中年危机”。10月15日&#xff0c;亚马逊AWS技术布道者Jeff Barr在AWS官网宣布亚马逊消费者业务永久弃用甲骨文(Oracle)数据库。 作者&#xff1a;温暖来源&#xff1a;镁客网 42岁的甲骨文迎来“中年危机”。 10月15日&#xff0c;亚马逊AWS技术布道者Jef…

[Leetcode][第461题][JAVA][汉明距离][位运算][Brian Kernighan]

【问题描述】[简单] 【解答思路】 1. 内置位计数功能 时间复杂度&#xff1a;O(1) 空间复杂度&#xff1a;O(1) class Solution {public int hammingDistance(int x, int y) {return Integer.bitCount(x ^ y); } }2. 移位 时间复杂度&#xff1a;O(1) 空间复杂度&#xff1…

第二十八期:Notepad++ 新 Logo 出炉,官网全新改版采用自适应设计

Notepad 的推特帐号发布了关于 notepad 的消息。与旧版 Logo 相比&#xff0c;新 Logo 整体的变化不大&#xff0c;不过官方则表示新版 Logo 比旧版的更吸引人&#xff0c;也更加简洁且更具意义。 新旧 Logo 对比如下&#xff08;左边为旧版 Logo&#xff09;&#xff1a; 除了…

React Navigation 导航栏样式调整+底部角标消息提示

五一佳节匆匆而过&#xff0c;有人选择在外面看人山人海&#xff0c;有人选择宅在家中度过五一&#xff0c;也有人依然坚守在第一线&#xff0c;致敬&#xff01; 这是坚持学习react-native的第二篇文章&#xff0c;可能会迟到&#xff0c;但是绝不会缺席&#xff0c;这篇要涉及…

反馈(Feedback)

说明&#xff1a;文章内容来源于课程视频和课程ppt。我只学习了课程没有做习题。文章不是翻译&#xff0c;是我对课程的理解。  终于到了第四部分了。之前提到过的&#xff0c;一个文本检索系统分词索引打分反馈。前面三部分都已经在前面的文档中介绍了。现在看反馈。反馈是根…

【数据结构与算法】堆

一&#xff1a;如何理解“堆” 1&#xff0c;堆是一个完全二叉树&#xff1b; 完全二叉树要求除了最后一层&#xff0c;其他层的节点都是满的&#xff0c;最后一层的节点都靠左排列。 2&#xff0c;堆中每个节点都必须大于等于&#xff08;或小于等于&#xff09;其子树中每个…

第五十三期:资深技术Leader肺腑忠告:如何成为技术大牛?

这篇文章&#xff0c;对于每一个想成为技术大牛的人来说都值得仔细阅读好几遍。 作者&#xff1a;曹乐来源&#xff1a;再成长一次 图片来自 Pexels 双生说&#xff1a;曹乐是典型学霸&#xff0c;清华本硕&#xff0c;多年互联网大厂研发经验&#xff0c;所以“资深”。我刚…

互联网搜索引擎

说明&#xff1a;文章内容来源于课程视频和课程ppt。我只学习了课程没有做习题。文章不是翻译&#xff0c;是我对课程的理解。 1 挑战 互联网搜索引擎与一般搜索引擎的区别主要在以下问题。  第一是数据量(scalability)。互联网搜索需要处理的数据量大&#xff0c;如何保证能…

python死磕八之迭代器与生成器

迭代是Python最强大的功能之一。初看起来&#xff0c;你可能会简单的认为迭代只不过是处理序列中元素的一种方法。 然而&#xff0c;绝非仅仅就是如此&#xff0c;还有很多你可能不知道的&#xff0c; 比如创建你自己的迭代器对象&#xff0c;在itertools模块中使用有用的迭代模…