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 主要由以下几个核心组件构成:

  1. Master 节点:控制平面,负责管理整个集群。包括 API Server(提供集群管理的 REST API)、Scheduler(负责将容器调度到合适的节点上)、Controller Manager(管理各种控制器,确保集群的状态符合预期)等。

  2. 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 [email protected]:/etc/hosts
[root@k8s ~]# scp /etc/hosts [email protected]:/etc/hosts
[root@k8s ~]# scp /etc/hosts [email protected]:/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 [email protected]:/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 [email protected]:/mnt
[root@k8s ~]# scp *.rpm [email protected]:/mnt
[root@k8s ~]# scp -r /etc/docker/ [email protected]:/etc/
[root@k8s ~]# scp -r /etc/docker/ [email protected]:/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  [email protected]:/opt/
[root@k8s mnt]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm  libcgroup-0.41-19.el8.x86_64.rpm  [email protected]:/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 [email protected]:/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 [email protected]:/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 [email protected]:/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 [email protected]:/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 [email protected]:/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              21m   v1.30.0
k8s-node2.timinglee.org    Ready              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

你可能感兴趣的:(kubernetes,容器,云原生,运维,网络,linux,docker)