一、Kubernetes简介
Kubernetes(简称 K8s)是一个开源的容器编排引擎,用于自动化部署、扩展和管理容器化应用。
核心概念
Pod:K8s 中最小的部署单元,是一组容器的集合,共享网络和存储资源。Pod 中的容器通常是紧密相关的,共同完成一个特定的功能。
Node:是 K8s 中的工作节点,可以是物理机或虚拟机,用于运行 Pod。
Deployment:用于管理 Pod 的副本数量、更新策略等,实现应用的高可用和弹性伸缩。
Service:提供了一种抽象方式,将一组 Pod 暴露为一个稳定的网络服务,实现负载均衡和服务发现。
Namespace:用于隔离不同的用户、项目或环境,确保资源的安全性和独立性。
主要功能
自动化部署:K8s 可以自动将容器部署到集群中的节点上,无需手动操作。通过定义 Deployment 等资源对象,可以指定容器的副本数量、更新策略等,实现应用的快速部署和更新。
弹性伸缩:根据应用的负载情况,K8s 可以自动调整容器的副本数量,实现弹性伸缩。例如,当应用的负载增加时,可以自动增加容器的副本数量,以提高系统的性能和可用性;当负载减少时,可以自动减少容器的副本数量,以节约资源。
负载均衡:K8s 中的 Service 提供了负载均衡功能,可以将请求分发到多个 Pod 上,实现高可用和高性能。Service 可以通过不同的负载均衡策略,如轮询、随机等,将请求分发到不同的 Pod 上。
服务发现:K8s 中的 Service 还提供了服务发现功能,可以让其他应用自动发现和访问服务。通过 Service 的名称和标签,其他应用可以轻松地找到对应的服务,并进行通信。
存储管理:K8s 支持多种存储类型,如本地存储、网络存储等。可以通过 PersistentVolume 和 PersistentVolumeClaim 等资源对象,为应用提供持久化存储。
配置管理:K8s 可以管理应用的配置信息,如环境变量、命令行参数等。可以通过 ConfigMap 和 Secret 等资源对象,将配置信息与应用分离,实现配置的动态更新和管理。
二、8s的架构
一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件
1 master:集群的控制平面,负责集群的决策
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd :负责存储集群中各种资源对象的信息
2 node:集群的数据平面,负责为容器提供运行环境
kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡
三、k8s集群部署
1、部署环境准备:
主机 | 角色 | IP |
master 集群控制节点 | master 集群控制节点 | 172.25.250.100 |
k8s-node1.exam.com | worker 工作节点 | 172.25.250.10 |
k8s-node2.exam.com | worker 工作节点 | 172.25.250.20 |
reg.exam.com | harbor镜像仓库 | 172.25.250.250 |
所有的节点要禁用防火墙和selinux
所以节点同步时间和解析
所有节点安装docker和-ce
所有节点禁用swap
2、所有节点禁用swap和本地解析
[root@k8s-master ~]# systemctl list-unit-files | grep swap
#关闭系统中所有的交换空间
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# 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
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. After editing this file, run 'systemctl daemon-reload' to update systemd units generated from this file. /dev/mapper/rhel-root | | xfs | defaults | | | /dev/mapper/rhel-swap | none | swap | defaults | 0 0 |
本地解析
[root@k8s-master ~]# vim /etc/hosts
172.25.250.100 k8s-master.exam.com
172.25.250.10 k8s-node1.exam.com
172.25.250.20 k8s-node2.exam.com
172.25.250.250 reg.exam.com
安装docker
[root@k8s-master ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name=docker
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0
[root@k8s-master ~]# dnf install docker-ce -y
设置docker的资源管理器模式为systemd
[root@k8s-master ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://reg.westos.org"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
所有阶段复制harbor仓库中的证书并启动docker
[root@k8s-master ~]# ls -l /etc/docker/certs.d/reg.exam.com/ca.crt
[root@k8s-master ~]# systemctl enable --now docker
#登陆harbor仓库
[root@k8s-master ~]# docker login reg.exam.com
[root@k8s-master ~]# docker info
Client: Docker Engine - Community
Version: 27.1.2
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.16.2
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.29.1
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 27.1.2
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd #资源管理更改为systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 8fc6bcff51318944179630522a095cc9dbf9f353
runc version: v1.1.13-0-g58aa920
init version: de40ad0
Security Options:
seccomp
Profile: builtin
cgroupns
Kernel Version: 5.14.0-427.13.1.el9_4.x86_64
Operating System: Red Hat Enterprise Linux 9.4 (Plow)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 736.3MiB
Name: k8s-master.exam.com
ID: f3c291bf-287d-4cf6-8e69-5f21c79fa7c6
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://reg.exam.com/ #认证harbor仓库
Live Restore Enabled: false
安装部署k8s工具
#部署harbor软件仓库,添加k8s源
[root@k8s-master ~]# vim /etc/yum.repos.d/k8s.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm
gpgcheck=0
#检测网络是否连通
#安装软件
[root@k8s-master ~]# dnf install kubelet-1.30.0-150500.1.1 kubeadm-1.30.0-150500.1.1 kubectl-1.30.0-150500.1.1 --downloadonly --downloaddir=/mnt -y
[root@k8s-master mnt]# dnf install *.rpm -y
设置kubectl命令补齐功能
[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source ~/.bashrc
在所节点安装cri-docker
[root@k8s-master ~]# dnf install libcgroup-0.41-19.el8.x86_64.rpm cri-dockerd-0.3.14-3.el8.x86_64.rpm -y
[root@k8s-master ~]# 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
指定网络插件名称及基础容器镜像
[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service
#指定网络插件名称及基础容器镜像
...
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.exam.com/k8s/pause:3.9
...
--network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.9
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl start cri-docker
[root@k8s-master ~]# ll /var/run/cri-dockerd.sock
srw-rw---- 1 root docker 0 8月 26 22:14 /var/run/cri-dockerd.sock #cri-dockerd的套接字文件
在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
上传镜像到harbor仓库
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' \
| awk -F "/" '{system("docker tag "$0" reg.exam.com/k8s/"$3)}'
[root@k8s-master ~]# docker images | awk '/k8s/{system("docker push "$1":"$2)}'
集群初始化
启动kubelet服务
[root@k8s-master ~]# systemctl status kubelet.service
[root@k8s-master docker]# systemctl start kubelet.service
执行初始化命令
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository=reg.exam.com/k8s \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository=reg.exam.com/k8s --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock
#初始化报错 重新初始化
一定注意IP使用默认10.244.0.0
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
--------------------------------------------------
指定集群配置文件变量
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source ~/.bash_profile
当前节点没有就绪,因为还没有安装网络插件,容器没有运行
[root@k8s-master ~]# kubectl get nodes
[root@k8s-master ~]# kubectl get pod -A
安装flannel网络插件
#下载flannel的yaml部署文件
[root@k8s-master ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
[root@k8s-master ~]# curl -L -o kube-flannel.yml https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
#下载镜像:
[root@k8s-master ~]# docker pull docker.io/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1
##新建仓库并上传到仓库
[root@k8s-master ~]# docker tag flannel/flannel:v0.25.5 \
reg.exam.com/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker push reg.exam.com/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 \
reg.exam.com/flannel/flannel-cni-plugin:v1.5.1-flannel1
[root@k8s-master ~]# docker push reg.exam.com/flannel/flannel-cni-plugin:v1.5.1-flannel1
#编辑kube-flannel.yml 修改镜像下载位置
[root@k8s-master ~]# vim kube-flannel.yml
#需要修改以下几行
[root@k8s-master ~]# 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-master ~]# kubectl apply -f kube-flannel.yml
节点扩容
在所有的worker节点中
1 确认部署好以下内容
2 禁用swap
3 安装:
kubelet-1.30.0
kubeadm-1.30.0
kubectl-1.30.0
docker-ce
cri-dockerd
4 修改cri-dockerd启动文件添加
–network-plugin=cni
–pod-infra-container-image=reg.timinglee.org/k8s/pause:3.9
启动服务
kubelet.service
cri-docker.service
[root@k8s-node1 & 2 ~]# kubeadm join 172.25.250.100:6443 --token pvtgvf.dgrw07jzfyykyxwr --discovery-token-ca-cert-hash sha256:b4b3d322be5d756177f4b38755b753393a81d9cd266370d193cbd610d32b4a28 --cri-socket=unix:///var/run/cri-dockerd.sock
可能会遇到插件问题
[root@k8s-master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-4dkn8 0/1 Init:ImagePullBackOff 0 9m29s
kube-flannel kube-flannel-ds-6bg6b 0/1 Init:ImagePullBackOff 0 54m
kube-flannel kube-flannel-ds-xbjlk 0/1 Init:ImagePullBackOff 0 9m29s
重新初始化
[root@k8s-master ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.exam.com/k8s --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-master ~]# vim 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
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master.exam.com Ready control-plane 38s v1.30.0
#重新初始化
[root@k8s-node1,2 ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
kubeadm join 172.25.250.100:6443 --token 8mstsi.kvb94ivl2pivcjvr \
--discovery-token-ca-cert-hash sha256:1ccb1ee51389bdcff6356a6bacf982578b41cc023689a03b7cf69424e2929557 --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-master ~]# kubectl -n kube-flannel get pods
3、测试
建立一个pod
[root@k8s-master ~]# kubectl run test --image nginx
查看pod状态
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
test 1/1 Running 0 6m29s
删除pod
[root@k8s-master ~]# kubectl delete pod test
pod "test" deleted