k8s集群安装

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

[1. 准备yum仓库](#1. 准备yum仓库)

[2. 系统环境配置](#2. 系统环境配置)

[3. 安装软件包](#3. 安装软件包)

[3.1 本地dns映射,yum装包](#3.1 本地dns映射,yum装包)

[3.2 配置containerd,让它知道harbor仓库在哪](#3.2 配置containerd,让它知道harbor仓库在哪)

[3.3 启动并开机自启kubelet、containerd](#3.3 启动并开机自启kubelet、containerd)

[4. 配置内核参数](#4. 配置内核参数)

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

[4.2 打开内核模块的功能](#4.2 打开内核模块的功能)

[5. 镜像上传harbor仓库](#5. 镜像上传harbor仓库)

[5.1 安装docker](#5.1 安装docker)

[5.2 镜像包导入本地](#5.2 镜像包导入本地)

[5.3 将镜像上传到harbor](#5.3 将镜像上传到harbor)

[6. 给kubeadm、kubectl配置tab键](#6. 给kubeadm、kubectl配置tab键)

[7. master节点的安装](#7. master节点的安装)

[7.1 测试系统环境](#7.1 测试系统环境)

[7.2 master节点初始化](#7.2 master节点初始化)

[7.3 验证安装结果](#7.3 验证安装结果)

二、calico网络插件安装

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

[1.1 从docker官方拉镜像](#1.1 从docker官方拉镜像)

[1.2 修改资源文件中image:地址](#1.2 修改资源文件中image:地址)

[1.3 用资源文件跑项目](#1.3 用资源文件跑项目)

[1.4 验证结果](#1.4 验证结果)

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

三、计算节点安装

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

[2. 给计算节点安装基础环境](#2. 给计算节点安装基础环境)

[3. 验证集群安装结果](#3. 验证集群安装结果)

四、技术点解析:

[1. kubeadm命令,集群管理工具kubeadm](#1. kubeadm命令,集群管理工具kubeadm)

五、过程问题:

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

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

[3. k8s学习曲线如何?](#3. k8s学习曲线如何?)

[4. calico需要在计算节点安装?](#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来制定网络策略

一、m a s t e r 节点 安装(以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

二、c a l i c o 网络 插件 安装

安装背景:

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

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

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

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

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

现在先以搭建出一个完整的k8s集群为主。

1 . 官方 c a l i c o 直接 做成了 项目 通过 项目 文件 启动 安装 完成

非常提高部署效率

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

需要用到一个calico的资源文件,是个yaml文件

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

calico.yaml文件地址

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

具体步骤:

1 . 1 d o c k e r 官方拉镜像

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

1 . 2 修改 资源 文件 i m a g e:地址

calico.yaml源文件中,镜像是从docker官方仓库拉的,把镜像地址改成harbor仓库的

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

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

修改之后:

1 . 3 资源 文件 项目
1 . 4 验证 结果

网络配置好了,节点就ready了,ifconfig也能看到自动给此节点配置的ip

这个ip是干嘛的?

这个ip的子网掩码为什么是32?

这个ip是不同节点上的pod相互通信的隧道端点,每一个节点上都有这么一个隧道端点,用的ip-to-ip的方式

这个ip是个单个的固定的,所以是32位掩码

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

pod的通信需求有三个:

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

节点间通信,用calico搭建的这个扁平化网络

与公网通信,通过节点网关,eth0

三、计算 节点 安装

1 . 通过命令行 生成 t o k e n h a s h 以及 加入 集群 命令

在kubeadm init 安装master节点的时候,保存了安装日志

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

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

token是什么?

就是证书,在集群里面通行的通行证,要干嘛的时候,拿出来给对方一看,哦,自己人

旧的token的TTL太短,可以删除,重新建立一个

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

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

步骤和master节点的2、3、4步骤一样,写一个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 . c a l i c o 需要 计算 节点 安装

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

相关推荐
南猿北者7 小时前
docker容器
docker·容器
YCyjs8 小时前
K8S群集调度二
云原生·容器·kubernetes
Hoxy.R8 小时前
K8s小白入门
云原生·容器·kubernetes
€☞扫地僧☜€11 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
全能全知者12 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
为什么这亚子14 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
ZHOU西口16 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
牛角上的男孩16 小时前
Istio Gateway发布服务
云原生·gateway·istio
JuiceFS18 小时前
好未来:多云环境下基于 JuiceFS 建设低运维模型仓库
运维·云原生
景天科技苑18 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统