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 []:[email protected]

# 上传本地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 [email protected]:/etc/hosts \[root@k8s-node1 \~\]# scp /etc/hosts [email protected]:/etc/hosts \[root@k8s-node1 \~\]# scp /etc/hosts [email protected]:/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 [email protected]:/mnt [root@k8s-master ~]# scp *.rpm [email protected]:/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 [email protected]:/opt/ [email protected]'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 [email protected]:/opt/ [email protected]'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 [email protected]:/etc/yum.repos.d/ [email protected]'s password: k8s.repo 100% 98 198.4KB/s 00:00 [root@k8s-master yum.repos.d]# scp /etc/yum.repos.d/k8s.repo [email protected]:/etc/yum.repos.d/ [email protected]'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

相关推荐
张青贤1 小时前
Docker 常用使用命令
运维·docker·容器
东风微鸣1 小时前
管理大规模监控技术栈的最佳实践
docker·云原生·kubernetes·可观察性
~卷心菜~2 小时前
【Docker基础-镜像】--查阅笔记2
docker·容器
it界的哈士奇2 小时前
docker部署scylladb
运维·docker·容器·scylladb
oceanweave5 小时前
【kind管理脚本-2】脚本使用说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本
云原生·kind
oceanweave5 小时前
【kind管理脚本-1】便捷使用 kind 创建、删除、管理集群脚本
docker·kubernetes·kind
两点王爷9 小时前
docker 运行自定义化的服务-后端
运维·docker·容器
弧襪10 小时前
K8S-证书过期更新
云原生·容器·kubernetes
东风微鸣13 小时前
Grafana将弃用AngularJS-我们该如何迁移
docker·云原生·kubernetes·可观察性
开心码农1号14 小时前
当一个 HTTP 请求发往 Kubernetes(K8s)部署的微服务时,整个过程流转时怎样的?
http·微服务·kubernetes