Kubernetes 简介与部署全攻略
目录
一.Kubernetes 简介
二.Kubernetes 的优点
1. 自动化管理:
2. 可扩展性:
3. 灵活性和便携性:
4. 资源管理和优化:
三.Kubernetes 的缺点
1. 学习曲线较陡:
2. 资源消耗较大:
3. 网络复杂性:
四.部署方法
4.1. 环境准备
4.2. 在所节点安装cri-docker
4.3. 所有禁用swap
4.4. 安装K8S部署工具;设置kubectl命令补齐功能;全
4.5. 在master节点拉取K8S所需镜像
4.6. 集群初始化
4.7. 安装flannel网络插件
4.8. 节点扩容
一.Kubernetes 简介
Kubernetes,通常简称为 K8s,是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。 它最初由 Google 设计并开发,基于 Google 多年来在大规模容器管理方面的经验。Kubernetes 的目标是提供一个可靠、可扩展且高效的平台,让开发者能够轻松地在不同的环境中运行和管理容器化的应用。 Kubernetes 主要由以下几个核心组件构成:
-
Master 节点:控制平面,负责管理整个集群。包括 API Server(提供集群管理的 REST API)、Scheduler(负责将容器调度到合适的节点上)、Controller Manager(管理各种控制器,确保集群的状态符合预期)等。
-
Node 节点:工作节点,负责运行容器。每个 Node 上运行着 Kubelet(与 Master 通信,管理本节点上的容器)和 Container Runtime(如 Docker 等,负责运行容器)。
二.Kubernetes 的优点
1. 自动化管理:
-
自动部署和扩展:可以根据应用的负载自动增加或减少容器的数量,确保应用始终有足够的资源来处理请求。例如,在电商促销活动期间,当流量增加时,Kubernetes 可以自动启动更多的容器来处理增加的负载。
-
自我修复:能够自动检测和修复失败的容器。如果一个容器崩溃或出现故障,Kubernetes 会自动重新启动它或在其他节点上重新调度一个新的容器,确保应用的高可用性。
2. 可扩展性:
-
轻松应对大规模应用:可以管理数千个节点和数以万计的容器,适用于大型企业级应用和大规模分布式系统。无论是处理高并发的 Web 应用还是大规模的数据分析任务,Kubernetes 都能提供强大的扩展能力。
-
支持多种应用类型:不仅适用于无状态应用,也可以管理有状态应用,如数据库、消息队列等。通过提供 StatefulSet 等资源对象,可以确保有状态应用在容器化环境中的稳定运行。
3. 灵活性和便携性:
-
支持多种容器运行时:可以与不同的容器运行时(如 Docker、Containerd、CRI-O 等)配合使用,让用户可以根据自己的需求选择合适的容器技术。
-
跨云平台和本地部署:可以在不同的云服务提供商(如 AWS、Azure、Google Cloud 等)以及本地数据中心中运行,提供了一致的管理体验,方便用户在不同的环境中迁移和部署应用。
4. 资源管理和优化:
-
高效的资源分配:可以根据应用的需求动态分配 CPU、内存和存储等资源,提高资源利用率。避免了资源的浪费,同时确保每个容器都能获得足够的资源来运行。
-
负载均衡:内置了强大的负载均衡机制,可以将请求均匀地分发到不同的容器上,提高应用的性能和可靠性。可以根据不同的负载均衡策略(如轮询、最少连接等)进行配置,以满足不同应用的需求。
三.Kubernetes 的缺点
1. 学习曲线较陡:
-
复杂的概念和术语:Kubernetes 涉及到很多复杂的概念,如 Pod、Deployment、Service、Ingress 等,对于初学者来说,理解和掌握这些概念需要一定的时间和精力。
-
配置和管理复杂:配置 Kubernetes 集群需要对网络、存储、安全等方面有一定的了解。同时,管理一个大规模的 Kubernetes 集群也需要专业的技能和经验。
2. 资源消耗较大:
-
较高的硬件要求:运行 Kubernetes 集群需要一定的硬件资源,特别是对于大规模的集群,需要更多的计算、存储和网络资源。这可能会增加企业的基础设施成本。
-
资源开销:Kubernetes 本身也会消耗一定的资源来运行控制平面和各个组件。虽然可以通过优化配置来减少资源开销,但仍然需要考虑这部分资源的消耗。
3. 网络复杂性:
-
网络配置复杂:在 Kubernetes 中,容器之间的网络通信需要进行特殊的配置,特别是在跨节点通信和服务发现方面。这可能需要使用额外的网络插件和工具,增加了网络管理的复杂性。
-
网络性能问题:在某些情况下,容器网络可能会出现性能问题,如延迟增加、吞吐量下降等。这需要对网络进行优化和调整,以确保应用的性能。
四.部署方法
K8S中文官网:Kubernetes
主机名 | ip | 角色 |
---|---|---|
harbor.timinglee.org | 172.25.254.11 | harbor仓库 |
k8s.lps.org | 172.25.254.100 | master,k8s集群控制节点 |
node1.lps.org | 172.25.254.10 | worker,k8s集群工作节点 |
node2.lps.org | 172.25.254.20 | worker,k8s集群工作节点 |
注意: 所有节点禁用selinux和防火墙 所有节点同步时间和解析 所有节点安装docker-ce 所有节点禁用swap,注意注释掉/etc/fstab文件中的定义
4.1. 环境准备
#本地解析
[root@k8s ~]# vim /etc/hosts
...
172.25.254.100 k8s.lps.org
172.25.254.11 harbor.timinglee.org
172.25.254.10 node1.lps.org
172.25.254.20 node2.lps.org
[root@k8s ~]# scp /etc/hosts root@172.25.254.10:/etc/hosts
[root@k8s ~]# scp /etc/hosts root@172.25.254.20:/etc/hosts
[root@k8s ~]# scp /etc/hosts root@172.25.254.11:/etc/hosts
#仓库一定要配对
#部署docker;提前下载,直接拖入
[root@k8s ~]# tar zxf docker.tar.gz
[root@k8s ~]# dnf install *.rpm -y #报错的话,可能是runc包重复。删掉即可。
#支持认证,配置私有仓库
[root@harbor ~]# scp /root/certs/timinglee.org.crt root@172.25.254.100:/etc/docker/certs.d/harbor.timinglee.org/ca.crt
[root@harbor ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://harbor.timinglee.org"]
}
[root@harbor ~]# systemctl enable --now docker
[root@harbor ~]# docker login harbor.timinglee.org
[root@harbor harbor]# docker compose down #要进入harbor目录才行#关过机之后需要down一下。
[root@harbor harbor]# docker compose up -d
[root@k8s ~]# ping harbor.timinglee.org
[root@k8s ~]# mkdir /etc/docker/certs.d/harbor.timinglee.org/ -p
[root@k8s ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://harbor.timinglee.org"]
}
[root@k8s ~]# systemctl enable --now docker
[root@k8s ~]# docker pull nginx
#工作节点配置docker
[root@k8s ~]# scp *.rpm root@172.25.254.10:/mnt
[root@k8s ~]# scp *.rpm root@172.25.254.20:/mnt
[root@k8s ~]# scp -r /etc/docker/ root@172.25.254.10:/etc/
[root@k8s ~]# scp -r /etc/docker/ root@172.25.254.20:/etc/
[root@node1 mnt]# dnf remove runc-3:1.1.0-2.el9.x86_64 -y
[root@node1 mnt]# dnf install *.rpm -y
[root@node1 mnt]# docker login harbor.timinglee.org
[root@node1 mnt]# systemctl enable --now docker
[root@node1 mnt]# docker pull nginx
[root@node2 mnt]# dnf remove runc-3:1.1.0-2.el9.x86_64 -y
[root@node2 mnt]# dnf install *.rpm -y
[root@node2 mnt]# docker login harbor.timinglee.org
[root@node2 mnt]# systemctl enable --now docker
[root@node2 mnt]# docker pull nginx
4.2. 在所节点安装cri-docker
k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker
软件下载:GitHub - Mirantis/cri-dockerd: dockerd as a compliant Container Runtime Interface for Kubernetes
#拖入cri-dockerd和libcgroup;安装cri-docker
[root@k8s 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@k8s 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@k8s mnt]# dnf install *.rpm -y
[root@node2 opt]# ls
containerd cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm
[root@node2 opt]# dnf install *.rpm -y
[root@node1 opt]# ls
containerd cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm
[root@node1 opt]# dnf install *.rpm -y
[root@k8s ~]# vim /lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service wants=network-online.target
Requires=cri-docker.socket
[service]
Type=notify
#指定网络插件名称及基础容器镜像
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=harbor.timinglee.org/k8s/pause:3.9
ExecReload =/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec= 2
Restart=always
[root@k8s mnt]# systemctl daemon-reload
[root@k8s mnt]# systemctl start cri-docker
[root@k8s mnt]# ll /var/run/cri-dockerd.sock
srw-rw---- 1 root docker 0 Sep 2 21:55 /var/run/cri-dockerd.sock #cri-dockerd的套接字文件
[root@k8s mnt]# scp /lib/systemd/system/cri-docker.service root@172.25.254.10:/lib/systemd/system/cri-docker.service
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl start cri-docker
[root@k8s mnt]# scp /lib/systemd/system/cri-docker.service root@172.25.254.20:/lib/systemd/system/cri-docker.service
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl start cri-docker
4.3. 所有禁用swap
[root@k8s ~]# systemctl status dev-nvme0n1p3.swap
[root@k8s ~]# systemctl mask dev-nvme0n1p3.swap
[root@k8s ~]# vim /etc/fstab
....
# /etc/fstab
# Created by anaconda on Sun Feb 19 17:38:40 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=ddb06c77-c9da-4e92-afd7-53cd76e6a94a /boot xfs defaults 0 0
#/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media iso9660 defaults 0 0
[root@k8s ~]# swapoff /dev/nvme0n1p3
systemctl list-unit-files | grep swap
4.4. 安装K8S部署工具;设置kubectl命令补齐功能;全
#部署软件仓库,添加k8s源
[root@k8s ~] # vim /etc/yum.repos.d/k8s.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm
gpgcheck=0
#安装软件
dnf makecache
[root@k8s ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 --downloadonly --downloaddir=/mnt
[root@k8s mnt]# scp kubeadm-1.30.0-150500.1.1.x86_64.rpm kubectl-1.30.0-150500.1.1.x86_64.rpm kubelet-1.30.0-150500.1.1.x86_64.rpm kubernetes-cni-1.4.0-150500.1.1.x86_64.rpm cri-tools-1.30.1-150500.1.1.x86_64.rpm root@172.25.254.10:/mnt
[root@k8s mnt]# scp kubeadm-1.30.0-150500.1.1.x86_64.rpm kubectl-1.30.0-150500.1.1.x86_64.rpm kubelet-1.30.0-150500.1.1.x86_64.rpm kubernetes-cni-1.4.0-150500.1.1.x86_64.rpm cri-tools-1.30.1-150500.1.1.x86_64.rpm root@172.25.254.10:/mnt
#设置kubectl命令补齐功能
[root@k8s ~]# dnf install kubeadm-1.30.0-150500.1.1.x86_64.rpm kubectl-1.30.0-150500.1.1.x86_64.rpm kubelet-1.30.0-150500.1.1.x86_64.rpm kubernetes-cni-1.4.0-150500.1.1.x86_64.rpm -y
[root@k8s ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s ~]# source ~/.bashrc
4.5. 在master节点拉取K8S所需镜像
[root@k8s ~]# kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \ #手动指定位置。
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock
#这里是提前下载,直接拖入
#在harbor上面新建一个仓库k8s,公开的。
#上传镜像到harbor仓库
[root@k8s ~]# docker images | awk '/google/{ print $1":"$2}' \
| awk -F "/" '{system("docker tag "$0" harbor.timinglee.org/k8s/"$3)}'
[root@k8s ~]# docker images | awk '/k8s/{system("docker push "$1":"$2)}'
4.6. 集群初始化
#启动kubelet服务
[root@k8s ~]# systemctl status kubelet.service
#执行初始化命令,准备环境等你加入。
[root@k8s ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository harbor.timinglee.org/k8s --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock
#一直卡着就重置
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s ~]# systemctl restart cri-docker
[root@k8s ~]# ll /var/run/cri-dockerd.sock
srw-rw---- 1 root docker 0 Sep 2 22:40 /var/run/cri-dockerd.sock
#指定集群配置文件变量
[root@k8s ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s ~]# source ~/.bash_profile
#当前节点没有就绪,因为还没有安装网络插件,容器没有运行
[root@k8s ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master.timinglee.org NotReady control-plane 4m25s v1.30.0
[root@k8s ~]# kubectl get pod -A
4.7. 安装flannel网络插件
官方网站:GitHub - flannel-io/flannel: flannel is a network fabric for containers, designed for Kubernetes
#下载flannel的yaml部署文件
[root@k8s ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
#现在镜像:
[root@k8s ~]# docker pull docker.io/flannel/flannel:v0.25.5
[root@k8s ~]# docekr docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1
#提前下载,直接拖,
[root@k8s ~]# docker load -i flannel-0.25.5.tag.gz
#上传镜像到仓库,如果没有就搞一个flannel
[root@k8s ~]# docker tag flannel/flannel:v0.25.5 \
harbor.timinglee.org/flannel/flannel:v0.25.5
[root@k8s ~]# docker push harbor.timinglee.org/flannel/flannel:v0.25.5
[root@k8s ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 \
harbor.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
[root@k8s ~]# docker push harbor.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
#编辑kube-flannel.yml 修改镜像下载位置
[root@k8s ~]# vim kube-flannel.yml
#需要修改以下几行
[root@k8s ~]# grep -n image kube-flannel.yml
146: image: flannel/flannel:v0.25.5
173: image: flannel/flannel-cni-plugin:v1.5.1-flannel1
184: image: flannel/flannel:v0.25.5
#安装flannel网络插件
[root@k8s ~]# kubectl apply -f kube-flannel.yml
4.8. 节点扩容
确保在所有的worker节点中
-
禁用swap
-
安装:kubelet-1.30.0;kubeadm-1.30.0 ;kubectl-1.30.0 ;docker-ce;cri-dockerd
-
修改cri-dockerd启动文件添加 :--network-plugin=cni;--pod-infra-container-image=reg.timinglee.org/k8s/pause:3.9
-
启动服务:kubelet.service;cri-docker.service
#生成的集群token找不到了可以重新生成
[root@k8s ~]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token 5hwptm.zwn7epa6pvatbpwf --discovery-token-ca-cert-hash sha256:52f1a83b70ffc8744db5570288ab51987ef2b563bf906ba4244a300f61e9db23
#加入集群
[root@node1 & 2 ~]# kubeadm join 172.25.254.100:6443 --token 5hwptm.zwn7epa6pvatbpwf --discovery-token-ca-cert-hash sha256:52f1a83b70ffc8744db5570288ab51987ef2b563bf906ba4244a300f61e9db23 --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s ~]# scp flannel-0.25.5.tag.gz root@172.25.254.10:/root #节点也需要拉取flannel镜像,如果报错,就手动拉取,一般是自动拉取。
#在master阶段中查看所有node的状态;所有阶段的STATUS为**Ready**状态,即可。有时间差。
[root@k8s ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master.timinglee.org Ready control-plane 98m v1.30.0
k8s-node1.timinglee.org Ready <none> 21m v1.30.0
k8s-node2.timinglee.org Ready <none> 21m v1.30.0
测试:
#建立一个pod
[root@k8s ~]# kubectl run test --image nginx
#查看pod状态
[root@k8s ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 6m29s
#删除pod
[root@k8s ~]# kubectl delete pod --force