本文最后更新于:2024年4月22日 下午
Kubernetes 介绍、主要功能、本地虚拟机环境搭建、
Kubernetes介绍
希腊语:舵手、飞行员
Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S。K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久。K8S主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。2015年7月,Kubernetes v1.0正式发布。
Kubernetes作为一个容器集群管理系统,用于管理容器云平台中多个主机上的容器应用,Kubernetes的目标是让部署容器化的应用变得简单且高效,所以 Kubernetes 提供了应用部署,规划,更新,维护的一整套完整的机制。
除了Docker容器之外,Kubernetes还支持其他多种容器,如 Containerd、rkt、CoreOS 等
认识Kubernetes
起源
源自于谷歌Borg
使用golang语言开发
简称为k8s
归属
现归属于CNCF
kubernetes版本
架构说明
节点组件
Master节点组件
master节点是集群管理中心,它的组件可以在集群内任意节点运行,但是为了方便管理所以会在一台主机上运行Master所有组件,并且不在此主机上运行用户容器
Master组件包括:
用于暴露kubernetes API,任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行。
控制器管理器,用于对控制器进行管理,它们是集群中处理常规任务的后台线程。
Node节点组件
node节点用于运行以及维护Pod, 管理volume(CVI)和网络(CNI),维护pod及service等信息
Node组件包括:
kubelet
- 负责维护容器的生命周期(创建pod,销毁pod),同时也负责Volume(CVI)和网络(CNI)的管理
kube-proxy
- 通过在主机上维护网络规则并执行连接转发来实现service(iptables/ipvs)
- 随时与apiserver通信,把Service或Pod改变提交给apiserver,保存至etcd(可做高可用集群)中,负责service实现,从内部pod至service和从外部node到service访问。
Container Runtime
- 容器运行时(Container Runtime)
- 负责镜像管理以及Pod和容器的真正运行
- 支持docker/containerd/Rkt/Pouch/Kata等多种运行时
Kubernetes环境搭建
使用kubeadm本地化部署目前最新版本kubernetes版本1.27,其他部署方式也可以使用kubeasz
、kubekey
等方式部署
Linux环境准备
主机系统说明
使用VMware来搭建虚拟机, aliyun镜像库 https://developer.aliyun.com/mirror/
centos7下载链接:https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2207-02.iso
虚拟机IP配置
参考:https://www.cnblogs.com/mayhot/p/15964506.html
修改ip的方式
改动如下 IPADDR
自己分配 、GATEWAY
查看虚拟机的网络NAT
网络配置
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.100.11
NETMASK=255.255.255.0
GATEWAY=192.168.100.2
DNS1=192.168.100.2
DNS2=114.114.114.114
如果重启网络还是连接不上,可能是NetworkManager导致的,关闭这个服务
参考:https://www.cnblogs.com/python-wen/p/11607969.html
我这里采用静态IP配置,网关设值为192.168.100.0 掩码是255.255.255.0 所以后续分配ip 就可以从 192.168.100.1~192.168.100.255
主机硬件配置说明
IP |
CPU |
内存 |
硬盘 |
主机名 |
192.168.100.11 |
4C |
6G |
50g |
master01 |
192.168.100.12 |
4C |
6G |
50g |
worker01 |
192.168.100.13 |
4C |
6G |
50g |
worker02 |
注意:这里分配6g内存并不会直接占用系统6g内存给当前虚拟机使用,而是动态去申请的
配置方式从原生的静态IP的纯净的系统中关机,克隆。克隆后重新设置静态ip,然后重启,使用shell工具链接,我这里使用FinalShell链接。
准备工作
主机名配置
主机名与IP地址解析
关闭防火墙配置
SELINUX配置
SELinux在Kubernetes中的作用是提供额外的安全层,增强容器化应用程序和整个集群的安全性。它限制容器的访问权限、提供安全策略、保护文件系统,并记录安全事件,有助于保护集群免受恶意行为和攻击。
时间同步设置
配置内核转发及网桥过滤
添加内核转发及网桥过滤配置文件
加载内核转发及网桥过滤配置文件
安装ipset及ipvsadm
主要用于实现service转发。
安装ipset、ipvsadm
配置ipvsadm模块加载方式
授权、运行、检查是否加载
关闭swap分区
在下面这行添加#注释
安装版本说明
k8s官方于 2020 年 12 月宣布弃用 dockershim,此后k8s从 1.2.0 到 1.2.3 版本如果使用 Docker 作为容器运行时会在 kubelet 启动时会打印一个弃用的警告日志,而最终k8s官方在 2022 年 4 月 的 Kubernetes 1.24 版本中完全移除了 dockershim(弃用dockershim相关问题官方说明)
k8s官方在1.24版本以后移除了docker ,后续采用k8s+containerd
方式进行搭配使用,如果后续还需使用docker 需要安装cri-docker
其实也就是k8s+docker+cri-docker
对于 k8s+containerd 和 k8s+docker 的两种方案网上也有网友进行了性能测试对比,前者的运行速度、效率都要比后者高,且各大公有云厂商也都往 containerd 切换,因此 k8s+containerd 的组合就成了目前最合适的方案了
我们这里第一简单安装采用低版本的k8s+docker就行,后续会继续出一篇新版本 k8s1.27版本的来做
版本如下:
查阅地址:https://github.com/kubernetes/kubernetes/blob/release-1.22/build/dependencies.yaml
kubernetes 1.21.0
+docker 20.10
Docker环境准备(所有节点均需要安装)
docker 20.10 版本安装
获取yum 源
安装Docker
设置docker开机启动并启动docker
修改cgroup方式
cgroup(控制组)是一种用于限制和隔离资源的Linux内核功能。它允许您在共享的主机上为容器分配和管理资源,例如CPU、内存、磁盘和网络等
配置docker镜像加速
重启docker
dokcer卸载
安装containerd
我们当前安装 kubernetes 1.21.0
+docker 20.10
,此步骤跳过
安装依赖软件包
添加阿里Docker源
添加overlay和netfilter模块
安装Containerd,这里安装最新版本
创建Containerd的配置文件
启动containerd
验证containerd是否安装成功
Kubernetes 1.21.0 (单master)集群部署
kubeadm、kubelet、kubectl安装
|
kubeadm |
kubelet |
kubectl |
版本 |
1.21.0 |
1.21.0 |
1.21.0 |
安装位置 |
集群所有主机 |
集群所有主机 |
集群所有主机 |
作用 |
初始化集群、管理集群等 |
用于接收api-server指令,对pod生命周期进行管理 |
集群应用命令行管理工具 |
配置yum源
安装
配置kubelet
保证docker使用的cgroupdriver与kubelet使用的cgroup的一致性
设置kubelet为开机自启动并启动
集群初始化(master初始化)
方式一:先下载镜像
集群镜像准备
脚本下载
官网 k8s.gcr.io 由于网络原因下载不下来
这里选用镜像下载
registry.cn-hangzhou.aliyuncs.com/google_containers/ 该镜像中 pause:3.4.1和 etcd:3.4.13-0 找不到 原因目前未知
registry.aliyuncs.com/google_containers/ 目前可行 就用它了
执行
然后执行集群初始化
遇到的问题
方式一执行集群初始化的时候还是会走k8s.gcr.io,所以应该从阿里云下下来后,重新tag 打成 k8s.gcr.io下面的包再执行初始化
方式二:使用阿里云镜像
遇到的问题
failed to pull image registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
原因:
安装时需要从 k8s.gcr.io 拉取镜像,但是该网站被我国屏蔽了,国内没法正常访问导致没法正常进行kubernetes正常安装,从Docker官方默认镜像平台拉取镜像并重新打tag的方式来绕过对 k8s.gcr.io 的访问
此时会生成从节点加入主节点的链接
然后更新生成的信息 主节点执行(master01执行)
两个从节点(worker01,worker02)执行加入操作,然后在两个从节点 worker01 和worker02上使用kubeadm 加入操作
如果加入报错节点存在可以执行重置后重新加入 kubeadm reset
如果忘了可以使用下面的这行命令重新生成
在主节点上查看从节点是否加入
集群网络准备
使用calico部署集群网络
安装参考网址:https://projectcalico.docs.tigera.io/about/about-calico
看 https://docs.tigera.io/archive/v3.23/getting-started/kubernetes/requirements 介绍
我们这里k8s用的版本是1.21.0 所对应的calico 版本是v3.23
第一种:基于operator安装calico
下载operator资源清单文件
如果不能直接应用(网络原因 可以先找个下载下来再使用apply应用)
上面文件过大 --server-side
目的解决 tigera-operator.yaml 过大导致创建失败的问题,停止使用 Client Side Apply(运行 kubectl apply 时的当前默认设置),而是使用 Server Side Apply,它不会将 last-applied-configuration 注释添加到对象。
kubectl delete -f tigera-operator.yaml 先删除再创建也可以
参考:https://www.cnblogs.com/lzjloveit/p/17223453.html
第二种:基于calico.yml安装
下载calico配置文件
这里 也是使用3.23版本
这里下载不下来就本地下载后传入服务器
修改配置文件
重点注意:这里不能添加时候不能使用tab只能使用空格键当做空格,不然创建的时候会报错
手动加载镜像(由于网络原因)
calico 用的是3.23.5版本
手动下载,后上传服务器解压,cd 到images目录,使用 docker load -i xxxx.tar
将镜像载入到当前服务器中
https://github.com/projectcalico/calico/releases/tag/v3.23.5
修改calico 文件
修改镜从阿里云上海地区拉取
执行创建calico.yaml创建网络
参考:
验证网络情况删除重装相关
停止kubelet服务
使用 kubeadm 重置
卸载相关应用
配置清理
手动清理kubernetes
此时删除失败会有占用 可执行 umount $(df -HT | grep '/var/lib/kubelet/pods' | awk '{print $7}')
后再清理
子节点(worker01、worker02)加入主节点(master01)
注意:子节点也需要通过docker load -i xxx.tar 加载calico镜像
然后删除现有的cali-node 会自动重启
删除命令
常用基础命令
部署应用Nginx
先部署一个nginx,后续详细学习其中应用 service中的yaml参数含义以及写法
执行创建应用
执行创建服务
验证是否创建成功
这里对应的30518就是系统默认分配的对外暴露端口
访问 http://192.168.100.11:30518/ 出现nginx首页即成功
安装Dashboard控制面板
github地址 https://github.com/kubernetes/dashboard