当前位置: 首页 > article >正文

k8s集群安装

一、master节点安装(以centos系统、k8s-1.29举例)

1. 准备yum仓库

2. 系统环境配置

3. 安装软件包

3.1 本地dns映射,yum装包

3.2 配置containerd,让它知道harbor仓库在哪

3.3 启动并开机自启kubelet、containerd

4. 配置内核参数

4.1 设置三个内核模块,启动并开机自启三个内核模块,k8s在运行的时候需要这三个内核模块。

4.2 打开内核模块的功能

5. 镜像上传harbor仓库

5.1 安装docker

5.2 镜像包导入本地

5.3 将镜像上传到harbor

6. 给kubeadm、kubectl配置tab键

7. master节点的安装

7.1 测试系统环境

7.2 master节点初始化

7.3 验证安装结果

二、calico网络插件安装

1. 官方把calico直接做成了项目,通过项目文件一启动,就安装完成了

1.1 从docker官方拉镜像

1.2 修改资源文件中image:地址

1.3 用资源文件跑项目

1.4 验证结果

2. 知识补充(关于pod的网络通信)

三、计算节点安装

1. 通过命令行生成token和hash,以及加入集群的命令

2. 给计算节点安装基础环境

3. 验证集群安装结果

四、技术点解析:

1. kubeadm命令,集群管理工具kubeadm

五、过程问题:

1. 怎么知道需要哪些镜像?kubeadm 安装集群的时候需要哪些镜像

2. init.yaml文件从哪里来?kubeadm init初始化集群的时候要用到

3. k8s学习曲线如何?

4. calico需要在计算节点安装?


harbor支持镜像复制,负载均衡,分布式

多台harbor,镜像同步复制,还可以负载均衡

官方对于k8s的部署方式,推荐容器化部署

官方把服务做成镜像,下载镜像、启动即可

用官方工具kubeadm部署

官方为了部署方便,还专门编写了一个kubeadm的集群管理工具

在集群中,用kubeadm进行配置管理和部署

kubeadm 用来初始化集群的指令

kubectl 用来与集群通信的命令行工具

kubelet 在集群的每个节点上,用来启动pod和容器等

离线部署

用本地容器镜像部署

控制平面节点,是运行控制平面组件的机器,包括etcd(集群数据库)和API服务器

(命令行工具kubectl与之通信)

cri container runtime interface # 是k8s与containerd交互用的

cni container network interface # 是pod间扁平化网络配置用的

初始化控制平面节点:

1. (CNCF官方推荐)如果计划将单个控制平面kubeadm集群升级为高可用,管理员应该指定

--control-plane-endpoint 为所有控制平面节点设置共享端点。端点可以是负载均衡器的DNS名称或IP地址

这个意思是,

比如在公有云上,买了一个ELB负载均衡器,把三个master节点作为负载均衡器一个监听器的监听的端口的后端服务器集群,然后在用kubeadm初始化这三个master节点的时候,加上--control-plane-endpoint选项,指向ELB负载均衡器的ip地址,就可以实现master节点集群的高可用

比如:

kubeadm init --control-plane-endpoint "192.168.1.xxx" --upload-certs

其中,--upload-certs长选项表示,master节点之间共享相同的证书,对于集群的高可用也比较重要

kubeadm init 首先运行一系列预检查以确保机器为运行Kubernetes准备就绪

记录kubeadm init 输出的 kubeadm join命令。管理员需要此命令将节点加入集群。

令牌(token)用于master节点和join节点之间的相互身份验证。这里的令牌是密钥。

要确保令牌的安全,应为拥有此令牌的任何人都可以将经过身份验证的节点添加到管理员管理的集群中。可以使用kubeadm token命令列出,创建和删除这些令牌。

需要部署一个CNI插件,container network interface

容器网络接口

就是给容器弄网络的插件

容器需要通过网络与容器外部交互

这个插件比如拥calico

不装这个CNI

coredns就不启动

要求pod的网络

pod之间的网络通信,主要是一个扁平化和ip地址话,核心是,pod之间的通信,不用通过宿主机的网络。而是通过pod的ip地址可以通信。那么实现这一个功能的核心是CNI插件,比如calico。其工作原理,相当于把整个集群中的pod进行统一管理,calico给pod分配ip,每个pod有唯一的ip地址。所以在初始化k8s集群的时候,会给pod和service分别设置一个CIDR地址块。

具体来讲,CNI插件会配置节点上的路由表,确保pod之间的通信可以通过集群内的网络来实现。比如calico会使用BGP边界网关协议,在节点之间传播路由信息,确保pod之间的通信路径是最优的。

什么是CIDR?

classless inter-domain routing 无类域间路由

什么是无类域间路由?

感觉听起来很厉害,但是好像又不能第一反应看出是什么意思

当然,对于网络工程师来讲,这个比较基础。

无类,是区别于传统的对于ipv4网路地址的类型划分,A、B、C类地址

CIDR的意思是一种方法,就是对ipv4地址不分类了,随便用

怎么随便弄?

比如

192.168.1.1/24

192.168.1.1/16

这两个ip地址就不一样

看着都是

192.168.1.1

但由于子网掩码不一样

所以不在一个网段

所以也不算同一个ip地址

这也是我们配置网络的时候,几乎都要配置子网掩码

其中24和16的意思是由多少个1

当ip地址的前24个二进制位是1的时候,代表ip地址的前24位是网络位,后8个二进制位是主机位

当ip地址的前16个二进制位是1的时候,代表前16位是网络位,后16位是主机位

比如

管理员经常会遇到192.168.0.0/16

这样对于网段的表示

按照传统的ipv4地址类型划分方法

192网段应该是C类地址,其子网掩码应该是24

那么这里为什么用16呢

就是用到了cidr地址划分方法

这样,ip地址会使用起来比较灵活。

所以,所谓CIDR

可以一句话概括

就是子网掩码随便变。

相当于对于爱吃辣条的人

有一片非常大的辣片,比如几平米

这个人可以随便巴拉一块自己吃

同时也可以分给自己的朋友们吃

不用规定,这个人只能从哪个角落开始

撕这个辣片,随便巴拉,只需要把巴拉了

哪块说清楚就好了,也就是子网掩码是多少。

BGP 边界网关协议 border gateway protocol

先不延伸了。

现在的核心是

尽量清晰化理解k8s的网络运作原理

所以需要对于网络的基础知识有合适程度的了解。

默认情况下,不会在master节点上调度pod

是用taint污点策略实现

找到token哈希值的命令在官方文档中有

k8s集群是什么?

是一组节点

是运行kubernetes代理的、master管理的,一组节点

kubernetes需要pki证书才能进行基于tls的身份验证。如果管理员使用kubeadm安装的kubernetes,则会自动生成集群所需的证书。管理员也可以自己生成证书。

k8s集群怎么安装?

官方推荐kubeadm

方法路径(官网文档中):

入门--->生产环境--->使用部署工具安装k8s--->使用kubeadm引导集群

容器是靠内核提供的封装和管理控制

先安装harbor,再安装master,然后再安装nodes

apiserver不仅是给客户端调用的,也是给k8s平台内部其他组件调用的

etcd里面存储的是元数据

apiserver的端口6443

etcd数据库的端口2379、2380

2379是用户与它交互,进行数据的增删改查用的

2380是组件集群的时候,用于集群的协商,数据的同步、通讯

kubelet和kube-proxy在集群的每个节点都有,包括master节点

kubelet是节点的代理,负责管理节点上的pod

kube-proxy节点上是网络通讯和负载均衡的重要组件

在centos系统上,部署k8s集群时

需要把firewalld软件卸载掉

因为k8s自己要接管防火墙

如果firewalld软件存在,则两者会对防火墙的策略控制形成争抢,影响系统的稳定性

也就是说k8s要找iptables来指定网络规则策略

firewalld运行的底层也是调用iptables来利用内核模块netfilter来制定网络策略

一、master节点安装(以centos系统、k8s-1.29举例)

安装背景:

master节点相当于k8s集群指挥部也是k8s集群起始点安装部署master节点集群主体基础搭建出来后面计算节点加入集群就可以

1. 准备yum仓库

方法一,官方做法:

方法二,用本地yum仓库:

把安装k8s集群所需软件包,放到本地yum仓库的目录中

比如,/var/localrepo

然后更新仓库清单文件

createrepo --update /var/localrepo

2. 系统环境配置

yum -y remove firewalld-* # 卸载firewalld软件

sed -i '/swap/d' /etc/fstab # 把含有swap的行删掉

swapoff -a # 关闭 swap

free -m # 验证swap是否已经关闭

setenforce 0

sed -i 's/^SELINUX=enforcing$/^SELINUX=permissive' /etc/selinux/config

3. 安装软件包
  • kubeadm # 集群安装、管理、配置的工具
  • kubelet # 是系统服务,在每个节点上管理pod
  • kubectl # 与集群通信的命令行工具
  • containerd # 创建容器,管理运行容器,是符合OCI标准的runtime
  • ipvsadm # 组建lvs负载均衡容器集群的命令行工具
  • iproute-tc # 网络流量控制,比如限制某个pod或service的带宽
  • ipset # 提高iptables的计算效率

k8s不是一个单一的服务,既然要在k8s里面组件容器集群,那么就需要一个负载均衡,1.14版本以后,默认使用ipvs作为负载均衡。lvs是负载均衡方式的名称,ipvs是对应的内核模块的名称,ipvsadm是命令行工具的名称,也是安装这个命令行工具,所需要的软件包的名称,用来与ipvs内核模块交互。

3.1 本地dns映射,yum装包

vim /etc/hosts # 对集群所有节点的ip和主机名做本地dns映射,包括harbor主机

yum -y install kubeadm kubelet kubectl containerd.io ipvsadm ipset iproute-tc

3.2 配置containerd,让它知道harbor仓库在哪

生成containerd的默认配置文件:

containerd config default > /etc/containerd/config.toml

vim /etc/containerd/config.toml

61行 sandbox_image = "harbor:443/k8s/pause:3.9" # pause:3.9是根容器的镜像,pause是镜像名称,3.9是镜像标签。创建所有容器之前,需要使用这个根容器来初始化环境,如果不初始化环境,其他容器创建不了。

125行 SystemdCgroup = true

简单来说,kubelet和containerd的cgroup的驱动,都选择systemd的方式

154行新插入:

        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]

          endpoint = ["https://harbor:443"]
# 找docker.io就来https://harbor:443
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor:443"]

          endpoint = ["https://harbor:443"]
# 找harbor:443就来https://harbor:443
        [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor:443".tls]

          insecure_skip_verify = true
# 跳过tls验证

3.3 启动并开机自启kubelet、containerd

systemctl enable kubelet containerd --now

4. 配置内核参数
4.1 设置三个内核模块,启动并开机自启三个内核模块,k8s在运行的时候需要这三个内核模块。

]# vim /etc/modules-load.d/containerd.conf # 这是一个新文件

overlay # 分层文件系统模块,镜像文件是一层一层的,就需要这个

br_netfilter # 网桥防火墙模块

xt_conntrack # 链接跟踪表,高负载时可以优化系统

]# systemctl start systemd-modules-load.service

这个配置文件的语法是每行一个模块名

启动这个系统服务之后,这三个模块就开机自动加载了

4.2 打开内核模块的功能

]# vim /etc/sysctl.d/99-kubernetes-cri.conf # 这是一个新文件,99表示文件加载顺序靠后

net.ipv4.ip_forward = 1 # 开启路由转发,容器需要通过宿主机对外通信

net.bridge.bridge-nf-call-iptables = 1 # 开启ipv4桥流量监控

net.bridge.bridge-nf-call-ip6tables = 1 # 开启ipv6桥流量监控

net.netfilter.nf_conntrack_mac = 1000000 # 设置连接跟踪表大小,用于优化系统

]# sysctl -p /etc/sysctl/d/99-kubernetes-cri.conf # 让配置生效

5. 镜像上传harbor仓库
5.1 安装docker

]# yum -y isntall docker-ce # 把docker当做镜像管理的工具,不是运行容器的工具

]# vim /etc/docker/daemon.json # 编写docker配置文件,这是一个新文件

{

"registry-mirrors": ["https://harbor:443"] # 私有仓库地址

"insecure-registries": ["harbor:443"]

}

]# docker login harbor:443 # 登录harbor仓库

Username:

Password:

Login Succeeded

5.2 镜像包导入本地

]# docker load -i v1.29.2.tar.xz

5.3 将镜像上传到harbor

用脚本tag\push\rmi给一大堆镜像打标签,上传harbor仓库,删除上传过的本地镜像

6. 给kubeadm、kubectl配置tab键

]# source <(kubeadm completion bash|tee /etc/bash_completion.d/kubeadm)

]# source <(kubectl completion bash|tee /etc/bash_completion.d/kubectl)

7. master节点的安装
7.1 测试系统环境

]# kubeadm init --config=init.yaml --dry-run 2>error.log #"2"代表标准错误输出,其中init.yaml可以参考,环境检测命令可以重复运行多次

kubeadm 配置(v1beta3) | Kubernetes

7.2 master节点初始化

]# rm -rf error.log /etc/kubernetes/tmp # 删除检测生成的临时文件

]# kubeadm init --config=init/init.yaml | tee init/init.log # 拿容器实打实的启动服务保存安装日志init/init.log文件

初始化完成之后,会有以下提示:

把这三条命令复制粘贴,命令行执行就行了

7.3 验证安装结果

]# kubectl get nodes

NAME STATUS ROLES AGE VERSION

master NotReady control-plane 2m44s v1.29.2

二、calico网络插件安装

安装背景:

不同主机节点之间pod通信是一个重要追求扁平化比如整个集群一个服务对应多个不同计算节点pod那么pod服务形成一致性那么podpod之间数据通信显得比较重要所以网络属于集群一个基础建设管理员手工配置工作量非常大而且pod动不动重建所以很需要网络插件完成自动部署网络通信基建

简而言之calico不仅实现容器主机互联互通同时做到了容器隔离控制并且设置访问策略

calico一种容器之间网络互通解决方案

关于calico底层如何实现这些功能以及具体每一组功能如何实现calico内核模块比如netfilter如何交互这些底层细节延伸

说白了就是,大家说这个好用,很多人都在用,我们就先把它用会,边用边体验,然后根据体验再考虑其底层原理。

现在搭建出一个完整k8s集群

1. 官方calico直接做成了项目通过项目文件启动安装完成

非常提高部署效率

calico软件地址 https://github.com/projectcalico/calico

需要一个calico资源文件是个yaml文件

这个资源文件里面有5000行左右

calico.yaml文件地址

calico/manifests/calico.yaml at master · projectcalico/calico · GitHub

具体步骤

1.1 docker官方拉镜像

calico指定版本镜像本地,然后上传harbor仓库

1.2 修改资源文件image:地址

calico.yaml文件镜像docker官方仓库镜像地址改成harbor仓库

可以vim进去自己也可以sed命令改

]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' calico.yaml

修改之后

1.3 资源文件项目

1.4 验证结果

网络配置节点readyifconfig也能看到自动给此节点配置ip

这个ip干嘛

这个ip子网掩码为什么32

这个ip不同节点pod相互通信隧道端点每一个节点这么一个隧道端点ip-to-ip方式

这个ip单个固定所以32掩码

2. 知识补充(关于pod的网络通信)

pod通信需求三个

节点通信通过节点内部网络

节点通信calico搭建这个扁平化网络

公网通信通过节点网关eth0

三、计算节点安装

1. 通过命令行生成tokenhash以及加入集群命令

kubeadm init 安装master节点时候保存安装日志

安装日志说了如何计算节点加入集群如图

kubeadm token三个子命令以及token过期时间

token什么

就是证书集群里面通行通行证干嘛时候拿出来对方一看自己

tokenTTL太短可以删除,重新建立一个

生成一个tokenTTL设置长期有效具体需求打印出来加入集群命令,把这个生产的命令,复制粘贴保存起来

2.计算节点安装基础环境

步骤master节点234步骤一样一个ansible脚本一遍

计算节点加入集群

3. 验证集群安装结果

技术点解析:

1. kubeadm命令,集群管理工具kubeadm

命令选项

意思

config

查看需要哪些镜像,打印默认init文件

init

安装master节点

reset

还原安装状态,一键还原

计算节点退出集群时也用这个选项

join

计算节点加入集群

token

凭证管理(计算节点加入集群时要用)

help

命令的帮助信息

过程问题

1. 怎么知道需要哪些镜像?kubeadm 安装集群的时候需要哪些镜像

用kubeadm config images list命令

屏幕输出信息就会显示需要7个镜像

然后用网络从docker官网,docker pull 复制粘贴把这些镜像拉下来

然后docker save 保存成 tar 包

然后rsync传到本地主机,就可以docker load -i tar包,然后

tag push rmi 放到私有harbor仓库

2. init.yaml文件从哪里来?kubeadm init初始化集群的时候要用到

用kubeadm config print init-defaults打印出默认init文件

init文件,里面,主要是集群规划。以"---"作为分隔符,

上半部分的内容主要kubeadm初始化集群的配置

下半部分主要是集群的参数

修改:

12行,把ip地址改成master节点的ip

15行,socket文件地址改成containerd的socket文件地址

文件在/run/containerd/container.sock这个路径

17行,name的值改成master节点的主机名

32行,仓库地址改成harbor:443/k8s (这里的k8s是管理员规划的harbor项目名称)

34行,集群的版本号,可以用kubeadm config images list看到

dnsDomain下面插入一行:

podSubnet: 10.244.0.0/16

37行,服务子网,改成10.245.0.0/16

再增加两个个资源对象:

"---" # 启用IPVS模式

kind: KubeProxyConfiguration

apiVersion: kubeproxy.config.k8s.io/v1alpha1

mode: ipvs

ipvs:

strictARP: true

"---" # 设置kubelet使用的Cgroup驱动模式为systemd

kind: KubeletConfiguration

apiVersion: Kubelet.config.k8s.io/v1beta1

cgroupDriver: systemd

3. k8s学习曲线如何?

没有集群,学习需要投入更多精力

有集群,相对来说效果一点

4. calico需要计算节点安装

不需要k8s自动发现自动计算节点安装管理员只需要master节点安装一次就行


http://www.kler.cn/news/362384.html

相关文章:

  • 11. 事件机制
  • AnaTraf | 网络流量分析仪:网络故障排除的利器
  • 华为杯”第十三届中国研究生数学建模竞赛-C题:基于无线通信基站的室内三维定位问题(续)
  • 电脑视频剪辑大比拼,谁更胜一筹?
  • 15分钟学Go 第8天:控制结构 - 循环
  • 深入理解与优化 Java JVM
  • 2024/10/23 (easycovery密匙激活码为什么这么贵)
  • 调查显示软件供应链攻击增加
  • 知识问答网站毕业设计基于SpringBootSSM框架
  • git tag 用法
  • Spring Boot在线考试系统:JavaWeb技术的应用案例
  • 使用Redisson的布隆过滤器解决缓存穿透问题
  • 深入探索JavaScript异步编程:Promise与async/await的实现原理与应用
  • 如何获得Linux系统
  • 人工智能:引领未来的科技革命
  • 整理—Redis
  • MySQL-27.多表查询-案例
  • Cesium for UE-04-一些说明
  • Linux基础项目开发day05:量产工具——页面系统
  • 鹏哥C语言81-82---指针和数组+二级指针+指针数组
  • CentOS7安装RabbitMQ-3.13.7、修改端口号
  • PHP While 循环
  • 数组扁平化 JS代码实现 + 常用数组方法(未完)
  • C++ 通用数据库操作之 SOCI
  • YOLOv11改进策略【卷积层】| SAConv 可切换的空洞卷积 二次创新C3k2
  • 【建议收藏】大数据Flink入门专栏-v1.0,配套B站视频教程1小时速通