Kubernetes 笔记(06)— 搭建多节点集群、kubeadm 安装 master/worker/console/flannel 网络插件

news2024/9/20 8:55:00

1. kubeadm

官网:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/

为了简化 Kubernetes 的部署工作,社区里就出现了一个专门用来在集群中安装 Kubernetes 的工具,名字就叫 kubeadm,意思就是 Kubernetes 管理员。

kubeadm,原理和 minikube 类似,也是用容器和镜像来封装 Kubernetes 的各种组件,但它的目标不是单机部署,而是要能够轻松地在集群环境里部署 Kubernetes,并且让这个集群接近甚至达到生产级质量。

2. 集群架构

图里一共有 3 台主机,下面我来详细说明一下:
架构图

所谓的多节点集群,要求服务器应该有两台或者更多,为了简化我们只取最小值,所以这个 Kubernetes 集群就只有两台主机,一台是 Master 节点(管理整个集群),另一台是 Worker 节点(没有管理工作,只运行业务应用)。当然,在完全掌握了 kubeadm 的用法之后,你可以在这个集群里添加更多的节点。

基于模拟生产环境的考虑,在 Kubernetes 集群之外还需要有一台起辅助作用的服务器。它的名字叫 Console,意思是控制台,我们要在上面安装命令行工具 kubectl,所有对 Kubernetes 集群的管理命令都是从这台主机发出去的。这也比较符合实际情况,因为安全的原因,集群里的主机部署好之后应该尽量少直接登录上去操作。要提醒你的是,Console 这台主机只是逻辑上的概念,不一定要是独立,你在实际安装部署的时候完全可以复用之前 minikube 的虚拟机,或者直接使用 Master/Worker 节点作为控制台。

3. 准备工作

因为 Kubernetes 对系统有一些特殊要求,我们必须还要在 MasterWorker 节点上做一些准备。

3.1 修改主机名

由于 Kubernetes 使用主机名来区分集群里的节点,所以每个节点的 hostname 必须不能重名。你需要修改 /etc/hostname这个文件,把它改成容易辨识的名字,比如 Master 节点就叫 masterWorker 节点就叫 worker

sudo vi /etc/hostname

本次实验环境中:

  • Master 主机名为 test6
  • Worker 主机名为 dev-pc

3.2 安装 Docker

虽然 Kubernetes 目前支持多种容器运行时,但 Docker 还是最方便最易用的一种,所以我们仍然继续使用 Docker 作为 Kubernetes 的底层支持,使用 apt 安装 Docker Engine

安装完成后需要你再对 Docker 的配置做一点修改,在“/etc/docker/daemon.json”里把 cgroup 的驱动程序改成 systemd ,然后重启 Docker 的守护进程,具体的操作我列在了下面:


cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

3.3 修改网络设置

为了让 Kubernetes 能够检查、转发网络流量,你需要修改 iptables 的配置,启用 br_netfilter模块:


cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF

sudo sysctl --system

3.4 修改交换分区

需要修改 /etc/fstab,关闭 Linuxswap 分区,提升 Kubernetes 的性能:


sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

最后重启系统。

4. 安装 kubeadm

安装 kubeadm 时需要在 Master 节点和 Worker 节点上都做这一步。

kubeadm 可以直接从 Google 自己的软件仓库下载安装,但国内的网络不稳定,很难下载成功,需要改用其他的软件源,这里我选择了国内的某云厂商:


sudo apt install -y apt-transport-https ca-certificates curl

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt update

apt 默认会下载最新版本,但我们也可以指定版本号,比如使用和 minikube 相同的“1.23.3”:


sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00

安装完成之后,你可以用 kubeadm versionkubectl version 来验证版本是否正确:

test6@test6:~$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.3", GitCommit:"816c97ab8cff8a1c72eccca1026f7820e93e0d25", GitTreeState:"clean", BuildDate:"2022-01-25T21:24:08Z", GoVersion:"go1.17.6", Compiler:"gc", Platform:"linux/amd64"}
test6@test6:~$ kubectl version --short
Client Version: v1.23.3

另外按照 Kubernetes 官网的要求,我们最好再使用命令 apt-mark hold ,锁定这三个软件的版本,避免意外升级导致版本错误:


sudo apt-mark hold kubeadm kubelet kubectl

5. 下载 Kubernetes 组件镜像

前面我说过,kubeadmapiserveretcdscheduler 等组件都打包成了镜像,以容器的方式启动 Kubernetes,但这些镜像不是放在 Docker Hub 上,而是放在 Google 自己的镜像仓库网站 gcr.io,而它在国内的访问很困难,直接拉取镜像几乎是不可能的。

使用命令 kubeadm config images list 可以查看安装 Kubernetes 所需的镜像列表,参数 --kubernetes-version 可以指定版本号:

$ kubeadm config images list --kubernetes-version v1.23.3
k8s.gcr.io/kube-apiserver:v1.23.3
k8s.gcr.io/kube-controller-manager:v1.23.3
k8s.gcr.io/kube-scheduler:v1.23.3
k8s.gcr.io/kube-proxy:v1.23.3
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6

利用 minikube。因为 minikube 本身也打包了 Kubernetes 的组件镜像,所以完全可以从它的节点里把这些镜像导出之后再拷贝过来。

具体做法也很简单,先启动 minikube,然后 minikube ssh 登录进虚拟节点,用 docker save -o 命令把相应版本的镜像都保存下来,再用 minikube cp 拷贝到本地。
kaobei

6. 安装 Master 节点

kubeadm 的用法非常简单,只需要一个命令 kubeadm init 就可以把组件在 Master 节点上运行起来,不过它还有很多参数用来调整集群的配置。

sudo kubeadm init \
--apiserver-advertise-address=172.16.19.134 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.3 \
--pod-network-cidr=10.10.0.0/16

参数含义:

  • --pod-network-cidr,设置集群里 PodIP 地址段。
  • --apiserver-advertise-address,设置 apiserverIP 地址,也就是 Master 机器的 IP地址。
  • --kubernetes-version,指定 Kubernetes 的版本号。
  • --image-repository, 指定镜像源,有了这个参数就可以省掉第 5 步下载组件镜像的过程。

kubeadm init时指定的 apiserverip需要是自己环境上 master节点的 ip地址,如果指定错误,可通过sudo kubeadm reset重置。

执行结果如下:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

按照上面提示执行相关命令即可。

# 初始话失败再重新尝试需要清空环境
#重置
sudo kubeadm reset
#干掉kubelet进程
ps -ef|grep kubelet
sudo kill -9 进程id
#删掉配置目录
sudo rm -rf  /etc/kubernetes/manifests/

另外还有一个很重要的 kubeadm join提示,其他节点要加入集群必须要用指令里的 tokenca 证书,所以这条命令务必拷贝后保存好:

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.16.19.134:6443 --token h8dabp.4o6nlvw4h51p2uu3 \
        --discovery-token-ca-cert-hash sha256:b92bfc46494e236b5287ffb5be88ed0580de54abaa28873e116374805e118b6d

检查版本和集群节点状态

test6@test6:~$ kubectl version --short
Client Version: v1.23.3
Server Version: v1.23.3

test6@test6:~$ kubectl get node
NAME    STATUS     ROLES                  AGE   VERSION
test6   NotReady   control-plane,master   11m   v1.23.3
test6@test6:~$

你会注意到 Master 节点的状态是 NotReady,这是由于还缺少网络插件,集群的内部网络还没有正常运作。

7. 安装 Flannel 网络插件

Kubernetes 定义了 CNI 标准,有很多网络插件,这里我选择最常用的 Flannel,可以在它的 仓库里(https://github.com/flannel-io/flannel/)找到相关文档。

 wget https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml

需要修改文件里的“net-conf.json”字段,把 Network 改成刚才 kubeadm 的参数 --pod-network-cidr 设置的地址段。


  net-conf.json: |
    {
      "Network": "10.10.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

然后执行下面命令来安装 Flannel 网络。


kubectl apply -f kube-flannel.yml

稍等一小会,可以执行 kubectl get node 来看节点状态:

$ kubectl get node
NAME    STATUS   ROLES                  AGE   VERSION
test6   Ready    control-plane,master   28m   v1.23.3

这时你应该能够看到 Master 节点的状态是 Ready,表明节点网络也工作正常了。

8. 安装 Worker 节点

Worker 节点的安装就简单多了,只需要用之前拷贝的那条 kubeadm join 命令就可以了,记得要用 sudo 来执行:

sudo \
kubeadm join 172.16.19.134:6443 --token h8dabp.4o6nlvw4h51p2uu3      \
--discovery-token-ca-cert-hash sha256:b92bfc46494e236b5287ffb5be88ed0580de54abaa28873e116374805e118b6d

这里面的 token 默认有效期为 24 小时,如果忘记或者超时了可以执行 kubeadm token create --print-join-command创建一个新的 token。

Worker 节点安装完毕后,在 Master 机器执行 kubectl get node ,就会看到两个节点都是Ready状态:

$ kubectl get node
NAME     STATUS   ROLES                  AGE    VERSION
dev-pc   Ready    <none>                 70s    v1.23.3
test6    Ready    control-plane,master   133m   v1.23.3

Master 机器执行以下命令,查看是否正常。


kubectl run ngx --image=nginx:alpine
kubectl get pod -o wide

执行结果:

$ kubectl run ngx --image=nginx:alpine
pod/ngx created
test6@test6:~/k8s$ kubectl get pod -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP          NODE     NOMINATED NODE   READINESS GATES
ngx    1/1     Running   0          16s   10.10.1.2   dev-pc   <none>           <none>

会看到 Pod 运行在 Worker 节点(dev-pc)上,IP 地址是“10.10.1.2”,表明我们的 Kubernetes 集群部署成功。

9. 部署 Console 节点

Console 节点的部署工作更加简单,它只需要安装一个 kubectl

# 下载:
curl -LO https://dl.k8s.io/release/v1.23.3/bin/linux/amd64/kubectl

# 安装
sudo install kubectl /usr/local/bin/kubectl

# 
mkdir -p $HOME/.kube

然后复制 config文件就行,可以直接在 Master 节点上用 scp远程拷贝,其中 test@172.16.19.24 为 console 机器的地址。

scp ~/.kube/config test@172.16.19.24:~/.kube/

然后在 Console 机器测试下,

$ kubectl get nodes
NAME     STATUS   ROLES                  AGE    VERSION
dev-pc   Ready    <none>                 41m    v1.23.3
test6    Ready    control-plane,master   173m   v1.23.3
$ kubectl version --short
Client Version: v1.23.3
Server Version: v1.23.3

至此,kubeadmmaster + worker + console 的环境搭建完成了。

Console 就是一个向 Kubernetes集群发送命令的“控制台”,理论上是与 Kubernetes无关的,只要安装了 kubectl和相应的 config,能够与 Kubernetes集群通信就可以了。 任何有 kubectl的计算机都可以作为 console,所以 Kubernetes集群里的 masternode节点,只要有 kubectl,就可以认为是console。 它是一个逻辑角色,可以和已有的机器重合。

kubectl run ngx --image=nginx:alpine

这个命令式在 master敲的,我一直在 workder上敲。

可能是因为没有在 worker节点上拷贝 kubectlconfig文件,如果拷贝了那么就行了。
注意 kubectlKubernetes集群其实是彼此独立的,不能想当然认为 Kubernetes集群节点上一定可以用kubectl,可以再看一下集群的网络结构图。

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

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

相关文章

Java设计模式-状态模式State

介绍 状态模式&#xff08;State Pattern&#xff09;&#xff1a;它主要用来解决对象在多种状态转换时&#xff0c;需要对外输出不同的行为的问题。状态和行为是一一对应的&#xff0c;状态之间可以相互转换。当一个对象的内在状态改变时&#xff0c;允许改变其行为&#xff…

学习记录677@项目管理之配置管理案例

案例 Simple公司的质量管理体系中的配置管理程序文件中有如下规定: (1)由变更控制委员会(CCB)制定项目的配置管理计划; (2)由配置管理员(CMO)创建配置管理环境: (3)由CCB 审核变更计划; (4)项目中配置基线的变更经过变更申请、变更评估、变更实施后便可发布&#xff1b; (5)CC…

Java基础10:常用API(下)

Java基础10&#xff1a;常用API&#xff08;下&#xff09;一、Date二、SimpleDateFormat三、Calendar四、ZoneId五、Instant六、ZoneDateTime七、DateTimeFormatter八、LocalDate、LocalTime、LocalDateTime九、Duration、Period、ChronoUnit十、包装类一、Date Date类是一个…

基于PIL和Tesseract的数字计算验证码识别处理思路

如图,我们在使用python自动化的时候经常会遇到很多各式各样的验证码。这个是一个数字加法的验证码。 干扰项里包含完整的数字、字母信息,普通的OCR识别可能不是很准确。 但是不管怎们样,咱们先把必要的环境搭建起来,试一下Tesseract的识别结果吧。 1、安装Tesseract: 首…

屏蔽360阻止运程执行变更注册表自启动数据的办法

屏蔽360阻止运程执行变更注册表自启动数据的办法 运程服务器上的程序&#xff0c;由于需要。我在服务器中&#xff0c;加入更新升级自身&#xff08;exe&#xff09;文件&#xff0c;并变更操作系统自启动数据的代码。 实践证明&#xff0c;通过客户端&#xff0c;调用运程服务…

全景解析SSD IO QoS性能优化

一、NAND基本原理目前NAND已经从SLC发展到PLC&#xff0c;但是PLC离大规模上市还有一段距离&#xff0c;我们暂时先略过。市面上主要流通的就是4种NAND类型&#xff1a;SLC、MLC、TLC、QLC。随着每个寿命从高到低依次是SLC>MLC>TLC>QLC.随着单个cell含有的bit数越多&a…

Unity MRTK使用详解(Htc vive+LeapMotion)

MRTK-Unity是一个由Microsoft驱动的开源项目&#xff0c;提供了多种组件和功能&#xff0c;用于加速Unity中的跨平台MR应用程序开发。以下是其一些功能&#xff1a; 提供跨平台输入系统和用于空间交互和UI组件。 启用快速原型通过在编辑器中的模拟&#xff0c;让你马上看到变化…

创建大量TCP连接时会受到什么因素的限制?

1.文件描述符资源 用户级限制 我们可以使用ulimit命令查看系统允许当前用户进程打开的文件数限制&#xff1a; ulimit -n 我们可以使用 ulimit -n 文件数 来修改不过这种设置是临时的&#xff0c;只在当前的session中有效。为永久修改用户级文件描述符数限制&#xff0c;可以…

SpringBoot框架介绍及使用

1. 概述 1.1 SpringBoot 简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 1.2 微服务 微服务&#xff1a;架构风格&#xff08;服务微化&#xff09; 一个应用应该是一组小型服务&#xff1b;…

【速记】离散分布的实现算法

离散分布与 zipf 分布 下面的一段代码&#xff0c;能根据数值描述来生成对应概率的离散值&#xff1a; #include <iostream> #include <iomanip> #include <map> #include <random>using namespace std;int main() {std::random_device rd;std::mt19…

「计算机组成原理」计算机系统概述

文章目录一、计算机发展历程1.1 什么是计算机系统1.2 硬件的发展1.2.1 硬件发展1.2.2 摩尔定律1.3 软件的发展1.4 目前的发展趋势二、计算机系统的多级层次结构2.1 编程语言的三个等级2.2 计算机系统层次结构三、计算机硬件的基本组成3.1 冯诺依曼结构3.2 现代计算机结构四、计…

Codeforces Round #847 (Div. 3) 的 C. Premutation(找规律题)

题面&#xff1a;中文大意&#xff1a;如果一个n个数字的序列恰好包含了1到n的所有整数&#xff0c;那么这个序列就被称为置换。例如&#xff0c;序列[3&#xff0c;1&#xff0c;4&#xff0c;2]。1]和[2&#xff0c;1]是互换&#xff0c;但是[1&#xff0c;2&#xff0c;1]&a…

Java设计模式-备忘录模式Memento

介绍 备忘录模式&#xff08;Memento Pattern&#xff09;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。可以这里理解备忘录模式&#xff1a;现实生活中的备忘录是用来记录某…

window系统path环境变量删除了怎么办?

前言 纪念我今天装JDK配置环境时&#xff0c;误删了path环境变量&#xff0c;后总结的知识点&#xff0c;希望对大家有所帮助&#xff0c;期待大家的评论&#xff01; 目录 前言 方案一&#xff1a;从注册表里找 方案二&#xff1a;实在没办法&#xff0c;从网上复制 方案三…

7-1输入/输出系统-概念外设接口

文章目录一.I/O系统基本概念&#xff08;一&#xff09;输入/输出系统&#xff08;二&#xff09;I/O控制方式二.外部设备1.显示存储器VRAM2.字符显示器3.外储存器三.I/O接口1.I/O接口的功能2.I/O接口的基本结构3.I/O接口的工作原理4.I/O接口的类型5.I/O端口及其编址&#xff0…

网络编程(TCP+UDP)(3)

1)咱们之前所说的网络分层就是因为说如果说使用一个协议太复杂了&#xff0c;那么我们就需要把这个协议分层&#xff0c;每一个协议都会简单一些&#xff0c;灵活替换也更方便&#xff1b; 2)咱们现在需要实现一个网络计算器&#xff1b; 1)上图是模拟一个计算器服务器和客户端…

第01天-Java数据结构和算法

001_几个经典的算法面试题(1)暴力匹配不推荐KMP算法分治算法002_几个经典的算法面试题(2)回溯算法图的深度优先遍历算法(DFS) 贪心算法优化003_内容介绍和授课方式数据结构和算法的重要性课程亮点和授课方式004_数据结构和算法的关系005_编程中实际遇到的几个问题Java代码小结…

机器学习实战(第二版)读书笔记(3)——膨胀卷积,WaveNet

一、基础知识 对于一个卷积层&#xff0c;如果希望增加输出单元的感受野&#xff0c;一般可以通过三种方式实现&#xff1a; 增加卷积核的大小增加层数&#xff08;比如两层3 3 的卷积可以近似一层5 5 卷积的效果&#xff09;在卷积之前进行池化操作 其中第1&#xff0c;2种…

推荐5个很牛的开源项目

大家伙们年过了哈&#xff0c;该收拾收拾心情上班了。 不知道大家有没有这种感觉&#xff0c;年纪越大&#xff0c;越觉得年过得快。感觉好像才刚开始&#xff0c;马上初五了&#xff0c;初六送完穷鬼&#xff0c;初七送自己出来上班了&#xff08;没有哭&#xff09;。 不过…

Python编写的词频统计工具的使用说明

一、工具下载 https://download.csdn.net/download/huangbangqing12/87400984 二、工具使用方式 目录文件如下所示&#xff1a; 请先在word.txt文件里放入目标长尾词&#xff0c;一行一个&#xff1a; 文件-另存为&#xff1a; 选择utf-8编码并直接保存替换原文件&#xff1…