K8s简介及环境搭建

一、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 ![](https://i-blog.csdnimg.cn/direct/f979212b036542239a873ea588553dea.png) ##### 2、检测软件仓库 ![](https://i-blog.csdnimg.cn/direct/4ad343bb01204a188551bfc0dd3ce4fc.png) ##### 3、安装docker镜像 1、配置私有仓库,使其支持认证 ![](https://i-blog.csdnimg.cn/direct/581436ac922c4d5989d53a50470002ee.png) ![](https://i-blog.csdnimg.cn/direct/b07864eda7234a98af745652399a3755.png) 2、创建目录,目录与域名相同 ![](https://i-blog.csdnimg.cn/direct/36acd83fc9cf4eb1bb084a81f2a6b417.png) 3、在docker中将hub拷贝给主机master,并将其命名为ca.crt ![](https://i-blog.csdnimg.cn/direct/ee151ec4991244e79e7f68d4ce50915e.png) ![](https://i-blog.csdnimg.cn/direct/8bc4a8104ffa40dfb86f0bcea0d5a565.png) 重启 ![](https://i-blog.csdnimg.cn/direct/49110dea4e8f440db77cc1d9ff8d9973.png) ![](https://i-blog.csdnimg.cn/direct/3669adbe76ea4c3fbcab4b2f5aa7acf9.png) ![](https://i-blog.csdnimg.cn/direct/8f163941629d4bdc8f4345e13c9f1dfd.png) 4、检测 ![](https://i-blog.csdnimg.cn/direct/15edd5a7a6c346b4966d3aaa36309be2.png) 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 ![](https://i-blog.csdnimg.cn/direct/0fda72329d9943e6997daabac692b9d5.png) ![](https://i-blog.csdnimg.cn/direct/4de447c2a8924648a9ca7c0d2f82834f.png) ![](https://i-blog.csdnimg.cn/direct/a75625e4ea154e38814401af85554e26.png) ![](https://i-blog.csdnimg.cn/direct/db9084d003b54ffbbbed57da08c46bb0.png) ### 2.3 K8s 安装 #### 2.3.1 所有禁用swap和本地解析 ![](https://i-blog.csdnimg.cn/direct/a920eadc545a446996df4f46772dd15c.png) ![](https://i-blog.csdnimg.cn/direct/1a42f0ce04b24fbe90573e9772b7c38e.png) [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. ![](https://i-blog.csdnimg.cn/direct/b099699f6e1f481e80a85b45d3b71a5f.png) [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 依赖的安装 ![](https://i-blog.csdnimg.cn/direct/e53223e8d01c4cb0aececddc780c021f.png) [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. ![](https://i-blog.csdnimg.cn/direct/5b361601a6174af6914b6f07be2e956d.png) ![](https://i-blog.csdnimg.cn/direct/3f58f0876def4d59bf176b277290ca5a.png) [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 ![](https://i-blog.csdnimg.cn/direct/0a20b7809a464fdea8bb1fa3161aa7bc.png) [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** **所需镜像** ![](https://i-blog.csdnimg.cn/direct/7a3078a7189a42bba788803ba8e84300.png) ![](https://i-blog.csdnimg.cn/direct/e5fc67924611418d8f353b304ab99279.png) ![](https://i-blog.csdnimg.cn/direct/38795625a2dc4e21b21099b913927ea1.png) [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 ![](https://i-blog.csdnimg.cn/direct/6d24649f7476433da27449d46e52446c.png) #### 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 21m v1.30.0 k8s-node2.yee.org Ready 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

相关推荐
烟雨书信9 分钟前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记12 分钟前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花18 分钟前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay19 分钟前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu27 分钟前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记5 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
疯子的模样9 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
虚伪的空想家10 小时前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook
庸子12 小时前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
Lpy256912 小时前
Docker Desktop 安装到D盘(包括镜像下载等)+ 汉化
运维·docker·容器