k8s的介绍
虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境
-
优点:程序环境不会相互产生影响,提供了一定程度的安全性
-
缺点:增加了操作系统,浪费了部分资源
容器化部署:与虚拟化类似,但是共享了操作系统
容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:
-
一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
-
当并发访问量变大的时候,怎么样做到横向扩展容器数量
2 容器编排应用
为了解决这些容器编排问题,就产生了一些容器编排的软件:
-
Swarm:Docker自己的容器编排工具
-
Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用
-
Kubernetes:Google开源的的容器编排工具
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
-
自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
-
弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
-
服务发现:服务可以通过自动发现的形式找到它所依赖的服务
-
负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
-
版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
-
存储编排:可以根据容器自身的需求自动创建存储卷
k8s的架构
一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件
1 master:集群的控制平面,负责集群的决策
-
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
-
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
-
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
-
Etcd :负责存储集群中各种资源对象的信息
2 node:集群的数据平面,负责为容器提供运行环境
-
kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
-
Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)
-
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡
常用名词介绍
-
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
-
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的
-
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
-
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
-
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
-
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
-
NameSpace:命名空间,用来隔离pod的运行环境
部署
需要三台虚拟机,和一台以及配置了hub仓库的虚拟机
说明
一台虚拟机做master,IP为172.25.254.100
两台为node节点,IP为172.25.254.10和172.25.254.20
hub仓库的IP为172.25.254.200
这是hub仓库搭建好的样子
前提关闭虚拟机的selinx和防火墙
禁用三台虚拟机的swap和本地解析
[root@k8smaster ~]# vim /etc/fstab
[root@k8smaster ~]# systemctl mask swap.target
[root@k8smaster ~]# swapoff -a
安装docker
配置软件仓库,下载地址可以在阿里云上找
[root@k8smaster ~]# cd /etc/yum.repos.d/
[root@k8smaster yum.repos.d]# vim docker.repo
下载并安装docker
[root@k8smaster yum.repos.d]# dnf install docker-ce -y
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:0:02:44 前,执行于 2024年10月06日 星期日 16时57分04秒。
依赖关系解决。
========================================================================
软件包 架构 版本 仓库 大小
========================================================================
安装:
docker-ce x86_64 3:27.3.1-1.el9 docker-ce 27 M
安装依赖关系:
containerd.io x86_64 1.7.22-3.1.el9 docker-ce 43 M
docker-ce-cli x86_64 1:27.3.1-1.el9 docker-ce 7.9 M
安装弱的依赖:
docker-buildx-plugin x86_64 0.17.1-1.el9 docker-ce 14 M
docker-ce-rootless-extras x86_64 27.3.1-1.el9 docker-ce 4.4 M
docker-compose-plugin x86_64 2.29.7-1.el9 docker-ce 13 M
事务概要
========================================================================
安装 6 软件包
总下载:109 M
安装大小:426 M
下载软件包:
(1/6): docker-buildx-plugin-0.17.1-1.el 4.6 MB/s | 14 MB 00:02
(2/6): docker-ce-27.3.1-1.el9.x86_64.rp 6.2 MB/s | 27 MB 00:04
(3/6): containerd.io-1.7.22-3.1.el9.x86 5.4 MB/s | 43 MB 00:07
(4/6): docker-ce-rootless-extras-27.3.1 1.2 MB/s | 4.4 MB 00:03
(5/6): docker-ce-cli-27.3.1-1.el9.x86_6 1.5 MB/s | 7.9 MB 00:05
(6/6): docker-compose-plugin-2.29.7-1.e 7.0 MB/s | 13 MB 00:01
------------------------------------------------------------------------
总计 11 MB/s | 109 MB 00:09
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
准备中 : 1/1
安装 : docker-compose-plugin-2.29.7-1.el9.x86_64 1/6
运行脚本: docker-compose-plugin-2.29.7-1.el9.x86_64 1/6
安装 : docker-buildx-plugin-0.17.1-1.el9.x86_64 2/6
运行脚本: docker-buildx-plugin-0.17.1-1.el9.x86_64 2/6
安装 : docker-ce-cli-1:27.3.1-1.el9.x86_64 3/6
运行脚本: docker-ce-cli-1:27.3.1-1.el9.x86_64 3/6
安装 : containerd.io-1.7.22-3.1.el9.x86_64 4/6
运行脚本: containerd.io-1.7.22-3.1.el9.x86_64 4/6
安装 : docker-ce-rootless-extras-27.3.1-1.el9.x86_64 5/6
运行脚本: docker-ce-rootless-extras-27.3.1-1.el9.x86_64 5/6
安装 : docker-ce-3:27.3.1-1.el9.x86_64 6/6
运行脚本: docker-ce-3:27.3.1-1.el9.x86_64 6/6
验证 : containerd.io-1.7.22-3.1.el9.x86_64 1/6
验证 : docker-buildx-plugin-0.17.1-1.el9.x86_64 2/6
验证 : docker-ce-3:27.3.1-1.el9.x86_64 3/6
验证 : docker-ce-cli-1:27.3.1-1.el9.x86_64 4/6
验证 : docker-ce-rootless-extras-27.3.1-1.el9.x86_64 5/6
验证 : docker-compose-plugin-2.29.7-1.el9.x86_64 6/6
已更新安装的产品。
已安装:
containerd.io-1.7.22-3.1.el9.x86_64
docker-buildx-plugin-0.17.1-1.el9.x86_64
docker-ce-3:27.3.1-1.el9.x86_64
docker-ce-cli-1:27.3.1-1.el9.x86_64
docker-ce-rootless-extras-27.3.1-1.el9.x86_64
docker-compose-plugin-2.29.7-1.el9.x86_64
完毕!
其他两台也要可以再配置一边,也可以直接传输
安装
如果在安装时有软件冲突可以用dnf remove 来删除冲突的软件包
配置解析,解析三台主机都要有
[root@k8smaster ~]# vim /etc/hosts
其他两台主机也要
测试
找台主机ping,此时解析就以及配置好了
配置认证
在master创建目录,并把hub仓库的证书传给master
[root@k8smaster ~]# mkdir -p /etc/docker/certs.d/reg.mqw.org/
[root@hub harbor]# scp /data/certs/mqw.org.crt root@172.25.254.100:/etc/docker/certs.d/reg.mqw.org/ca.crt
root@172.25.254.100's password:
mqw.org.crt 100% 2114 1.5MB/s 00:00
测试,如果登录成功,则代表配置成功
指定docker默认的dockers仓库
[root@k8smaster ~]# cd /etc/docker/
[root@k8smaster docker]# vim daemon.json
{ "registry-mirrors": ["https://reg.mqw.org"] }
启动docker
[root@k8smaster docker]# systemctl enable --now docker
但此时还有问题,可以从docker info看到
添加配置模块
#开机时能自动激活
[root@k8smaster ~]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf
[root@k8smaster ~]# modprobe br_netfilter
[root@k8smaster ~]# vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
激活
[root@k8smaster ~]# sysctl --system
重启docker
[root@k8smaster ~]# systemctl restart docker
此时查看docker info 就没有问题了
测试
从仓库拉取镜像,此时代表成功(前提仓库里有镜像)
此时一台就配置好了,其他两台可以根据刚刚的配置来一遍,或者直接传输
在两台主机加载模块
[root@k8s2 ~]# modprobe br_netfilter
接着在两台主机激活,两台都要
[root@k8s2 ~]# sysctl --system
启动docker
[root@k8s2 ~]# systemctl enable --now docker
查看docker info,此时两台主机都没问题
测试,都能拉下镜像
此时三台主机的docker配置完成
配置k8s
创建软件仓库,三台都装(下载地址可以找阿里云)
[root@k8smaster ~]# cd /etc/yum.repos.d/
[root@k8smaster yum.repos.d]# vim k8s.repo
安装,三台都装
[root@k8smaster yum.repos.d]# dnf install kubeadm.x86_64 kubectl.x86_64 kubelet.x86_64 -y
安装插件,三台都要(可以从网上下载,传输到虚拟机)
安装
[root@k8smaster ~]# dnf install *.rpm -y
指定网络插件名称及基础容器镜像
[root@k8smaster ~]# vim /lib/systemd/system/cri-docker.service
其他两台主机也要
都启动
[root@k8smaster ~]# systemctl enable --now cri-docker.service
都启动kubelet
[root@k8smaster ~]# systemctl enable --now kubelet.service
在master节点拉取K8S所需镜像
[root@k8smaster ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock
上传到hub仓库
先在hub创建一个名为k8s的项目
之后把他们打上标签上传
[root@k8smaster ~]# docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0 reg.mqw.org/k8s/kube-apiserver:v1.30.0
[root@k8smaster ~]# docker push reg.mqw.org/k8s/kube-apiserver:v1.30.0
[root@k8smaster ~]# docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0 reg.mqw.org/k8s/kube-controller-manager:v1.30.0
[root@k8smaster ~]# docker push reg.mqw.org/k8s/kube-controller-manager:v1.30.0
[root@k8smaster ~]# docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.0 reg.mqw.org/k8s/kube-scheduler:v1.30.0
[root@k8smaster ~]# docker push reg.mqw.org/k8s/kube-scheduler:v1.30.0
[root@k8smaster ~]# docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.30.0 reg.mqw.org/k8s/kube-proxy:v1.30.0
[root@k8smaster ~]# docker push reg.mqw.org/k8s/kube-proxy:v1.30.0
[root@k8smaster ~]# docker tag registry.aliyuncs.com/google_containers/coredns:v1.11.3 reg.mqw.org/k8s/coredns:v1.11.3
[root@k8smaster ~]# docker push reg.mqw.org/k8s/coredns:v1.11.3
[root@k8smaster ~]# docker tag registry.aliyuncs.com/google_containers/pause:3.9 reg.mqw.org/k8s/pause:3.9
[root@k8smaster ~]# docker push reg.mqw.org/k8s/pause:3.9
[root@k8smaster ~]# docker tag registry.aliyuncs.com/google_containers/etcd:3.5.15-0 reg.mqw.org/k8s/etcd:3.5.15-0
[root@k8smaster ~]# docker push reg.mqw.org/k8s/etcd:3.5.15-0
上传完成后
拉集群
执行初始化命令
[root@k8smaster ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
> --image-repository reg.mqw.org/k8s \
> --kubernetes-version v1.30.0 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
如果配置错了重做,需要先删除,之后再开始重做
[root@k8smaster ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
指定集群配置文件变量
[root@k8smaster ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8smaster ~]# source ~/.bash_profile
设置kubectl命令补齐功能
[root@k8smaster ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8smaster ~]# source ~/.bashrc
安装网络插件
加载
[root@k8smaster ~]# docker load -i flannel-0.25.5.tag.gz
再hub仓库创建一个flannel的项目,之后上传镜像
[root@k8smaster ~]# docker tag flannel/flannel:v0.25.5 reg.mqw.org/flannel/flannel:v0.25.5
[root@k8smaster ~]# docker push reg.mqw.org/flannel/flannel:v0.25.5
[root@k8smaster ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 reg.mqw.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
[root@k8smaster ~]# docker push reg.mqw.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
查看
修改文件
[root@k8smaster ~]# vim kube-flannel.yml
把所有的image的路径改为,即去掉前面的
启用
[root@k8smaster ~]# kubectl apply -f kube-flannel.yml
此时master为ready状态
再其他两台主机启动服务
[root@k8s1 ~]# systemctl start kubelet.serv
之后翻找前面的初始化的后面的令牌,并复制到其他两台主机上,两台都要
[root@k8s1 ~]# kubeadm join 172.25.254.100:6443 --token n3u7gu.zzumlnbhevtohv9f --discovery-token-ca-cert-hash sha256:0c08e6ff75578e3b1778cf72c7e81c91397c4ec6de21ac5abde16c71a6df34d3 --cri-socket=unix:///var/run/cri-dockerd.sock
如果找不到了,可以重新生成
如果配置错了,要先删除,在继续配置
[root@k8s1 ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
查看,此时为配置成功
此时集群就配置完成
测试
运行一个nginx
[root@k8smaster ~]# kubectl run web --image nginx/nginx