一、Kubernetes简介
kubernetes 的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
- 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
- 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
- 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
- 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
1.1 K8s组件及其用途
k8s集群包括2种角色:master管理节点和node工作节点,至少要有一个node工作节点。
kubectl 是一个客户端的管理工具,直接管理API server,提供一个请求到一个api server,中间有一个auth认证(判断是否有权限访问)。
1、Master 节点包含4大组件,分别是:kube-api server、kube-controller-master、kube-scheduler、etcd,备注:etcd可以单独部署集群,不必在master节点上
|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------|
| 组件名称 | 作用 |
| kube-apiserver | master核心组件,k8s集群的统一访问入口,各组件的协调者,以RESTful API提供接口方式,所有的对象资源的增删改查和监听操作都交给APIServer处理后再提交给etcd数据库做持久化存储 |
| kube-controller-manager | 处理集群中常规后台任务,一个资源对应一个控制器,而controller-Manager就是负责处理这些控制器的,例如 deployment-controller、endpoint-controller(负责维护集群的状态,比如程序部署安排,故障检测,自动扩展,滚动更新等) |
| kube-scheduler | scheduler根据调度算法为新创建的pod选择一个node节点(负责集群资源调度,按照调度策略将pod绑定到某个node节点上,即给pod分配一个家) |
| etcd | 分布式键值存储数据库,用于保存集群状态数据,比如Pod,Service等对象信息,etcd可以有多个(etcd数据库集群),也可以不与master节点在一起,只要master能通过网络连接etcd数据库即可 |
2、Node节点包含2大组件,分别是:kubelet、kube-proxy
|------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
| 组件名称 | 作用 |
| kubelet | kubelet 是Master在Node节点上的Agent,管理node节点主机运行容器的生命周期,比如创建容器,Pod挂载数据卷,下载secret,获取容器和节点状态等工作,kubelet 将每个Pod转换成一组容器(负责维护容器的生命周期,即通过控制docker来创建、更新、销毁容器 |
| kube-proxy | 在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作,实现让Pod节点(一个或者多个容器)对外提供服务(负责提供集群内部的服务发现和负载均衡) |
1.2 K8s常用名词概念
|------------|---------------------------------------------------------|
| 名词 | 概念 |
| Master | 集群控制节点,每个集群需要至少一个 master 节点负责集群的管控 |
| Node | 工作负载节点,由 master 分配容器到这些 node 工作节点上,然后 node 节点上的 |
| Pod | kubernetes 的最小控制单元,容器都是运行在 pod 中的,一个 pod 中可以有 1 个或者多个容器 |
| Controller | 控制器,通过它来实现对 pod 的管理,比如启动 pod 、停止 pod 、伸缩 pod 的数量等 |
| Service | pod 对外服务的统一入口,下面可以维护者同一类的多个 pod |
| Label | 标签,用于对 pod 进行分类,同一类 pod 会拥有相同的标签 |
| NameSpace | 命名空间,用来隔离pod的运行环境 |
二、K8s环境部署
2.1 docker仓库环境部署
[root@docker-hub ~]# hostname
docker-hub
# 修改配置文件
[root@docker-hub ~]# cd /etc/yum.repos.d/
[root@docker-hub yum.repos.d]# vim docker.repo
[root@docker-hub yum.repos.d]# cat docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0
# 安装docker镜像
[root@docker-hub yum.repos.d]# yum install docker-ce -y
已安装:
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
[root@docker-hub yum.repos.d]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock-
-iptables=true
# 启动docker
[root@docker-hub yum.repos.d]# systemctl enable --now docker.service
[root@docker-hub yum.repos.d]# docker info
# 从本地上传registry并导入
[root@docker-hub ~]# ls
公共 视频 文档 音乐 anaconda-ks.cfg registry.tag.gz
模板 图片 下载 桌面
[root@docker-hub ~]# docker load -i registry.tag.gz
ce7f800efff9: Loading layer 7.644MB/7.644MB
30609d4f10dd: Loading layer 792.6kB/792.6kB
3b6a51496c9d: Loading layer 17.55MB/17.55MB
e704e9e3e9dc: Loading layer 3.584kB/3.584kB
f019f591461d: Loading layer 2.048kB/2.048kB
Loaded image: registry:latest
[root@docker-hub ~]# mkdir certs
# 做解析
[root@docker-hub ~]# vim /etc/hosts
[root@docker-hub ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.250 harbor.yee.org reg.yee.org
[root@docker-hub ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/yee.org.key -subjectAltName = DNS:reg.yee.org" -x509 -days 365 -out certs/yee.org.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shanxi
Locality Name (eg, city) [Default City]:XI'an
Organization Name (eg, company) [Default Company Ltd]:docker
Organizational Unit Name (eg, section) []:registry
Common Name (eg, your name or your server's hostname) []:reg.yee.org
Email Address []:admin@yee.org
# 上传本地harbor包并解压缩
[root@docker-hub ~]# tar zxf harbor-offline-installer-v2.5.4.tgz
[root@docker-hub ~]# ls
公共 文档 anaconda-ks.cfg registry.tag.gz
模板 下载 certs
视频 音乐 harbor
图片 桌面 harbor-offline-installer-v2.5.4.tgz
# 修改配置文件
[root@docker-hub ~]# cd harbor/
[root@docker-hub harbor]# cp harbor.yml.tmpl harbor.yml
[root@docker-hub harbor]# vim harbor.yml
hostname: reg.yee.org
certificate: /data/certs/yee.org.crt
private_key: /data/certs/yee.org.key
harbor_admin_password: 123
[root@docker-hub ~]# docker load -i nginx-latest.tar.gz
9853575bc4f9: Loading layer 77.83MB/77.83MB
72db5db515fd: Loading layer 114MB/114MB
8b87c0c66524: Loading layer 3.584kB/3.584kB
ec1a2ca4ac87: Loading layer 4.608kB/4.608kB
55e54df86207: Loading layer 2.56kB/2.56kB
f4f00eaedec7: Loading layer 5.12kB/5.12kB
5f0272c6e96d: Loading layer 7.168kB/7.168kB
Loaded image: nginx:latest
[root@docker-hub ~]# mkdir /data/
[root@docker-hub ~]# cd /data/
[root@docker-hub data]# cp /root/certs/ /data/ -r
[root@docker-hub data]# cd
[root@docker-hub ~]# cd harbor/
[root@docker-hub harbor]# ./install.sh --with-chartmuseum
[root@docker-hub harbor]# cd /root/certs/
[root@docker-hub certs]# ls
yee.org.crt yee.org.key
[root@docker-hub certs]# cp /root/certs/yee.org.crt /etc/docker/certs.d/reg.yee.org/ca.crt
做本地解析,路径:C:\Windows\System32\drivers\etc
测试harbor环境
上传镜像:
在docker界面创建文件夹yee
至此,harbor仓库搭建完成。
2.2 K8s集群部署
2.1.1 K8s环境部署说明
K8S 中文官网: https://kubernetes.io/zh-cn/
在本次实验中,我们采用一主多从集群结构类型,一台master节点,两台node节点。其中,maser结点命名为,node结点命名为node1、node2
|------------|----------------|-----------|
| 主机名 | ip | 扮演的角色 |
| k8s-master | 172.25.254.200 | K8s集群控制节点 |
| k8s-node1 | 172.25.254.10 | K8s集群工作节点 |
| k8s-node2 | 172.25.254.20 | K8s集群工作节点 |
2.1.2 K8s集群实验环境搭建
注意:
- 所有节点禁用selinux和防火墙
- 所有节点同步时间和解析
- 所有节点安装docker-ce
- 所有节点禁用swap,注意注释掉/etc/fstab文件中的定义
1、本地解析
[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.20:/etc/hosts
[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.100:/etc/hosts
[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.250:/etc/hosts
2、检测软件仓库
3、安装docker镜像
1、配置私有仓库,使其支持认证
2、创建目录,目录与域名相同
3、在docker中将hub拷贝给主机master,并将其命名为ca.crt
重启
4、检测
5、在node1、node2中拉取镜像:
# 将master中的后缀为rpm的所有文件全部拷贝到node1、node2中
[root@k8s-master ~]# scp *.rpm root@172.25.254.10:/mnt
[root@k8s-master ~]# scp *.rpm root@172.25.254.20:/mnt
# 在node1、node2中查看
[root@k8s-node1 ~]# cd /mnt/
[root@k8s-node1 mnt]# ls
containerd.io-1.7.20-3.1.el9.x86_64.rpm
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm
docker-ce-27.1.2-1.el9.x86_64.rpm
docker-ce-cli-27.1.2-1.el9.x86_64.rpm
docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm
docker-compose-plugin-2.29.1-1.el9.x86_64.rpm
hgfs
[root@k8s-node2 ~]# cd /mnt/
[root@k8s-node2 mnt]# ls
containerd.io-1.7.20-3.1.el9.x86_64.rpm
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm
docker-ce-27.1.2-1.el9.x86_64.rpm
docker-ce-cli-27.1.2-1.el9.x86_64.rpm
docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm
docker-compose-plugin-2.29.1-1.el9.x86_64.rpm
hgfs
# 在node1、node2安装
[root@k8s-node2 mnt]# dnf install *.rpm -y
2.3 K8s 安装
2.3.1 所有禁用swap和本地解析
[root@k8s-master mnt]# swapon -s
Filename Type Size Used Priority
/dev/nvme0n1p2 partition 5242876 0 -2
[root@k8s-node1 ~]# systemctl mask dev-nvme0n1p3.device
Created symlink /etc/systemd/system/dev-nvme0n1p3.device → /dev/null.
[root@k8s-node2 ~]# systemctl mask dev-nvme0n1p3.device
Created symlink /etc/systemd/system/dev-nvme0n1p3.device → /dev/null.
[root@k8s-node2 ~]# swapoff /dev/dm-1
[root@k8s-node2 ~]# swapon -s
[root@k8s-node1 dev]# systemctl status dev-dm\\x2d1.swap
● dev-dm\x2d1.swap - /dev/dm-1
Follows: unit currently follows state of dev-mapper-rhel\x2dswap.swap
Loaded: loaded
Active: active since Thu 2024-09-26 17:59:08 CST; 2 days ago
Until: Thu 2024-09-26 17:59:08 CST; 2 days ago
What: /dev/dm-1
[root@k8s-node1 dev]# systemctl mask dev-dm\\x2d1.swap
Created symlink /etc/systemd/system/dev-dm\x2d1.swap → /dev/null.
[root@k8s-node1 dev]# vim /etc/fstab
[root@k8s-node1 dev]# swapoff /dev/dm-1
[root@k8s-node1 dev]# swapon -s
2.3.2 依赖的安装
[root@k8s-master mnt]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm root@172.25.254.10:/opt/
root@172.25.254.10's password:
cri-dockerd-0.3.14-3.el8.x86_64.rpm 100% 11MB 182.8MB/s 00:00
libcgroup-0.41-19.el8.x86_64.rpm 100% 69KB 45.6MB/s 00:00
[root@k8s-master mnt]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm root@172.25.254.20:/opt/
root@172.25.254.20's password:
cri-dockerd-0.3.14-3.el8.x86_64.rpm 100% 11MB 214.2MB/s 00:00
libcgroup-0.41-19.el8.x86_64.rpm 100% 69KB 69.3MB/s 00:00
[root@k8s-node1 ~]# dnf install /opt/*.rpm -y
[root@k8s-node2 ~]# dnf install /opt/*.rpm -y
[root@k8s-node1 ~]# systemctl enable --now cri-docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service → /usr/lib/systemd/system/cri-docker.service.
[root@k8s-node2 ~]# systemctl enable --now cri-docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service → /usr/lib/systemd/system/cri-docker.service.
[root@k8s-master yum.repos.d]# dnf install kubelet-1.30.0 kubeadm-1.30.0 --downloadonly --downloaddir=/mnt
[root@k8s-master yum.repos.d]# scp /etc/yum.repos.d/k8s.repo root@172.25.254.20:/etc/yum.repos.d/
root@172.25.254.20's password:
k8s.repo 100% 98 198.4KB/s 00:00
[root@k8s-master yum.repos.d]# scp /etc/yum.repos.d/k8s.repo root@172.25.254.10:/etc/yum.repos.d/
root@172.25.254.10's password:
k8s.repo
[root@k8s-node1 mnt]# dnf install kubelet-1.30.0 kubeadm-1.30.0 --downloadonly --downloaddir=/mnt -y
[root@k8s-node1 mnt]# dnf install kubectl-1.30.0 -y
2.3.3 设置 kubectl 命令补齐
[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source ~/.bashrc
2.3.4 在节点安装cri-docker及其****在 master 节点拉取 K8S 所需镜像
[root@k8s-master ~]# kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.30.0 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.11.1
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.12-0
[root@k8s-master ~]# kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.30.0 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.11.1
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.12-0
2.3.5 集群初始化
[root@k8s-master ~]# systemctl status kubelet.service
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.timinglee.org/k8s \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>
~/.bash_profile
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master.timinglee.org NotReady control-plane 4m25s v1.30.0
root@k8s-master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS
RESTARTS AGE
kube-system coredns-647dc95897-2sgn8 0/1 Pending
0 6m13s
kube-system coredns-647dc95897-bvtxb 0/1 Pending
0 6m13s
kube-system etcd-k8s-master.timinglee.org 1/1 Running
0 6m29s
kube-system kube-apiserver-k8s-master.timinglee.org 1/1 Running
0 6m30s
kube-system kube-controller-manager-k8s-master.timinglee.org 1/1 Running
0 6m29s
2.3.6 节点扩容
# node1与node2相同操作
[root@k8s-node1 ~]# kubeadm join 172.25.254.100:6443 --token
5hwptm.zwn7epa6pvatbpwf --discovery-token-ca-cert-hash
sha256:52f1a83b70ffc8744db5570288ab51987ef2b563bf906ba4244a300f61e9db23 --crisocket=unix:///var/run/cri-dockerd.sock
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master.yee.org Ready control-plane 98m v1.30.0
k8s-node1.yee.org Ready <none> 21m v1.30.0
k8s-node2.yee.org Ready <none> 21m v1.30.0
# 建立
[root@k8s-master ~]# kubectl run test --image nginx
# 查看状态
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 6m29s
# 删除
root@k8s-master ~]# kubectl delete pod