Kubernetes 简介及部署方法

15 篇文章 0 订阅
10 篇文章 1 订阅

目录

1 Kubernetes 简介及原理

1.1 应用部署方式演变

1.2 容器编排应用

1.3 kubernetes 简介

1.4 K8S的设计架构

1.5 K8S 各组件之间的调用关系

1.6 K8S 的 常用名词感念

1.7 k8S的分层架构

2 K8S 集群环境搭建

2.1 k8s 中容器的管理方式

2.2 k8s中使用的几种管理容器的介绍

3 kubernetes 的环境部署

3.1 实验环境准备

3.1.1 所有机子配置dns解析 

3.1.2 部署docker

3.1.3 k8s 所有机子都需执行,指定仓库地址 

3.1.4 k8s 所有机子都需执行,存放仓库证书文件

3.1.5 查看仓库是否指定成功 

3.1.6 登录harbor仓库

3.2 关闭交换分区--k8s集群都得执行

3.3 安装kubernetes相关工具

3.4 在所有节点上安装插件cri-docker

3.4.1 支持 docker 插件cri-docker介绍

3.5 在master节点拉取K8S集群所需镜像

3.5.1 查看k8s初始化默认配置参数是否正确

3.5.2 使用国内源下载

3.5.3 查看是否拉取成功 

3.5.4 在harbor中新建项目

3.5.5 批量打标签并上传

 3.5.6 修改插件服务启动参数

3.6 初始化k8s集群

3.6.1 指定仓库地址 版本号 使用与docker通讯的插件

3.6.2 成功标志

3.6.3 指定配置文件 

3.6.4 查看节点状态

3.7 安装flannel网络插件

3.7.1 Flannel 介绍

3.7.2 使用魔法将镜像下载到本地

3.7.3 上传所需镜像到本地仓库

3.7.4 修改yml配置文件

3.7.5 运行并查看状态 

4 节点扩容(工作节点加入)

4.1 节点扩容的要求

4.2 MASTER 节点上获取token

4.3 复制到从节点指定套接字运行 


1 Kubernetes 简介及原理

1.1 应用部署方式演变

在部署应用程序的方式上,主要经历了三个阶段:

传统部署:互联网早期,会直接将应用程序部署在物理机上

  • 优点:简单,不需要其它技术的参与

  • 缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响

虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境

  • 优点:程序环境不会相互产生影响,提供了一定程度的安全性

  • 缺点:增加了操作系统,浪费了部分资源

容器化部署:与虚拟化类似,但是共享了操作系统

容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:

  • 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器

  • 当并发访问量变大的时候,怎么样做到横向扩展容器数量

1.2 容器编排应用

为了解决这些容器编排问题,就产生了一些容器编排的软件:

  • Swarm:Docker自己的容器编排工具

  • Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用

  • Kubernetes:Google开源的的容器编排工具

1.3 kubernetes 简介

  • 在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年

  • Borg系统运行管理着成千上万的容器应用。

  • Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。

  • Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。

kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器

  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整

  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务

  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡

  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本

  • 存储编排:可以根据容器自身的需求自动创建存储卷

1.4 K8S的设计架构

一个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内部的服务发现和负载均衡

1.5 K8S 各组件之间的调用关系

当我们要运行一个web服务时

  1. kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中

  2. web服务的安装请求会首先被发送到master节点的apiServer组件

  3. apiServer组件会调用scheduler组件决定到底应该把这个服务安装到哪个node节点上在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer。负责将未调度的 Pod 分配到集群中的合适节点上。

  4. apiServer调用controller-manager去调度Node节点安装web服务

  5. kubelet接收到指令后,会通知docker,然后由docker来启动一个web服务的pod

  6. 如果需要访问web服务,就需要通过kube-proxy来对pod产生访问的代理

1.6 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的运行环境

1.7 k8S的分层架构

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境

  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)

  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦

  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

  • Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等

  • Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

2 K8S 集群环境搭建

2.1 k8s 中容器的管理方式

CRI 实际上是 Container Runtime Interface 的缩写。CRI 是 Kubernetes 项目定义的一个标准接口,用于与不同的容器运行时(Container Runtimes)进行交互。通过 CRI,Kubernetes 可以与各种容器运行时进行通信,从而管理容器的生命周期。

CRI 的作用

CRI 的主要作用是定义了一个通用的接口,使得 Kubernetes 可以与不同的容器运行时进行通信。

具体来说,CRI 包括以下功能:

容器管理

  • 创建、启动、停止和删除容器。
  • 管理容器的生命周期。

镜像管理

  • 拉取、推送和管理容器镜像。

网络管理

  • 配置容器网络接口(NIC)。

资源管理

  • 分配和管理容器的资源(CPU、内存等)。

2.2 k8s中使用的几种管理容器的介绍

Kubernetes 集群创建方式主要涉及不同的容器运行时(Container Runtime)及其与 Kubernetes 的集成方式。以下是三种主要的创建方式及其特点

centainerd

containerd 是 Kubernetes 默认推荐和支持的容器运行时。containerd 是一个高性能、轻量级的容器运行时,专注于容器的生命周期管理。它被设计为与 Kubernetes 高度集成,并且提供了与 Kubernetes CRI 接口的实现。

docker

虽然 Kubernetes 在 1.24 版本之后正式移除了对 Docker 作为容器运行时的直接支持,但仍然可以通过 cri-dockerd(即 cri-docker)来实现与 Docker 的集成。cri-dockerd 是一个实现了Kubernetes CRI 接口的 Docker 引擎替代品。

cri-o

CRI-O 是另一种实现 Kubernetes CRI 接口的容器运行时。它旨在提供更轻量级的容器运行时,并且直接与 Kubernetes 集成,无需额外的中间层。

kubernetes 中文官网:

Kubernetesicon-default.png?t=O83Ahttps://kubernetes.io/zh-cn/

3 kubernetes 的环境部署

3.1 实验环境准备

主机名ip角色
reg.shuyan.com192.168.239.20harbor仓库
k8s-master192.168.239.100master,k8s集群控制节点
k8s-node1192.168.239.110worker,k8s集群工作节点
k8s-node2192.168.239.120worker,k8s集群工作节点

3.1.1 所有机子配置dns解析 

[root@complete certs]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.239.20  complete reg.shuyan.com
192.168.239.110 k8s-node1
192.168.239.120 k8s-node2
192.168.239.100 k8s-master

3.1.2 部署docker

(已经配置过网络源了不做介绍了)

[root@k8s-master ~]# dnf install docker-ce
[root@k8s-node1 ~]# dnf install docker-ce
[root@k8s-node2 ~]# dnf install docker-ce


[root@k8s-master ~]# systemctl enable --now docker 
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.

[root@k8s-master ~]# systemctl restart docker.service

3.1.3 k8s 所有机子都需执行,指定仓库地址 

所有节点设定docker的资源管理模式为systemd

[root@k8s-master ~]#  vim /etc/docker/daemon.json

{        # 第一行写的是harbor仓库的地址
        "registry-mirrors": ["https://reg.shuyan.com"],
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
        "log-opts": {
                "max-size": "100m"
        },
        "storage-driver": "overlay2"
}

[root@k8s-master ~]# systemctl restart docker.service

3.1.4 k8s 所有机子都需执行,存放仓库证书文件

[root@k8s-master ~]# mkdir -p /etc/docker/certs.d/reg.shuyan.com/
[root@k8s-master ~]# systemctl enable --now docker 
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.

仓库端将证书存到k8s 集群 

[root@complete certs]# pwd 
/data/certs
[root@complete data]# ls
ca_download  certs  database  job_logs  redis  registry  secret

[root@complete certs]# scp shuyan.crt root@192.168.239.100:/etc/docker/certs.d/reg.shuyan.com/
root@192.168.239.100's password: 
shuyan.crt                                                    100% 2175     3.1MB/s   00:00 
   
[root@complete certs]# scp shuyan.crt root@192.168.239.110:/etc/docker/certs.d/reg.shuyan.com/
root@192.168.239.110's password: 
shuyan.crt                                                    100% 2175     1.7MB/s   00:00 
   
[root@complete certs]# scp shuyan.crt root@192.168.239.120:/etc/docker/certs.d/reg.shuyan.com/
root@192.168.239.120's password: 
shuyan.crt                                                    100% 2175     2.6MB/s   00:00   

3.1.5 查看仓库是否指定成功 

[root@k8s-master ~]# systemctl restart docker.service
[root@k8s-node1 ~]# systemctl restart docker.service
[root@k8s-node2 ~]# systemctl restart docker.service
[root@k8s-master ~]# docker info

3.1.6 登录harbor仓库

除仓库的机子其余的所有机子都得登录

[root@k8s-master ~]# docker login reg.shuyan.com
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

3.2 关闭交换分区--k8s集群都得执行

[root@k8s-master ~]# systemctl list-unit-files | grep swap
dev-mapper-rl\x2dswap.swap                 generated       -
swap.target                                static          -
[root@k8s-master ~]# systemctl mask swap.target 
Created symlink /etc/systemd/system/swap.target → /dev/null.
[root@k8s-master ~]# systemctl list-unit-files | grep swap
dev-mapper-rl\x2dswap.swap                 generated       -
swap.target                                masked          disabled
[root@k8s-master ~]# swapoff -a 
[root@k8s-master ~]# vim /etc/fstab

/dev/mapper/rl-root     /                       xfs     defaults        0 0
UUID=a4ed9067-12b1-4a7e-af8e-a5430ba2edfb /boot                   xfs     defaults        0 0
UUID=1EB7-071A          /boot/efi               vfat    umask=0077,shortname=winnt 0 2
#/dev/mapper/rl-swap     none                    swap    defaults        0 0 

查看交换分区是否占用 

[root@k8s-master ~]# free -m
               total        used        free      shared  buff/cache   available
Mem:            1742         836         377          12         690         906
Swap:              0           0           0

3.3 安装kubernetes相关工具

(k8s集群所有机子都得执行)除仓库以外

[root@k8s-master ~]# vim /etc/yum.repos.d/k8s.repo

[k8s]
name=k8s-aliyun
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
gpgcheck=0

[root@k8s-master ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 -y

设置kubectl命令补齐功能 

[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source  ~/.bashrc

3.4 在所有节点上安装插件cri-docker

下载地址

https://github.com/Mirantis/cri-dockerdicon-default.png?t=O83Ahttps://github.com/Mirantis/cri-dockerd

3.4.1 支持 docker 插件cri-docker介绍

k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker

cri-dockerd 是 Docker 引擎的一个版本,它实现了 Kubernetes 的容器运行时接口(CRI)。CRI 是 Kubernetes 用来与容器运行时(如 Docker, containerd, etc.)通信的一套接口规范。

cri-dockerd允许 Kubernetes 直接管理 Docker 容器,而不需要使用额外的适配层。cri-dockerd 被设计为与 Kubernetes 集群兼容,并且可以作为集群中的容器运行时来使用。

-node1 ~]# yum localinstall cri-dockerd-0.3.14-3.el8.x86_64.rpm \
libcgroup-0.41-19.el8.x86_64.rpm

3.5 在master节点拉取K8S集群所需镜像

思路:将k8s集群所需镜像都拉下来,上传到镜像仓库到时候方便构建主节点和从节点

3.5.1 查看k8s初始化默认配置参数是否正确

[root@k8s-master ~]# kubeadm config print init-defaults

3.5.2 使用国内源下载

/var/run/cri-dockerd.sock 是 cri-dockerd(或 cri-docker)服务使用的 Unix 域套接字(Unix domain socket),用于与 Kubernetes 控制面进行通信。这个套接字允许 Kubernetes 通过 Container Runtime Interface (CRI) 与 Docker 引擎进行交互,从而管理和调度容器。

由于网络原因需要使用阿里云的进行下载

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

3.5.3 查看是否拉取成功 

[root@k8s-master ~]# docker images 
REPOSITORY                                                        TAG        IMAGE ID       CREATED         SIZE
registry.aliyuncs.com/google_containers/kube-apiserver            v1.30.0    c42f13656d0b   4 months ago    117MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.30.0    c7aad43836fa   4 months ago    111MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.30.0    259c8277fcbb   4 months ago    62MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.30.0    a0bf559e280c   4 months ago    84.7MB
registry.aliyuncs.com/google_containers/etcd                      3.5.12-0   3861cfcd7c04   7 months ago    149MB
registry.aliyuncs.com/google_containers/coredns                   v1.11.1    cbb01a7bd410   12 months ago   59.8MB
registry.aliyuncs.com/google_containers/pause                     3.9        e6f181688397   22 months ago   744kB

3.5.4 在harbor中新建项目

3.5.5 批量打标签并上传

批量打标签

[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' \
| awk 'BEGIN{FS="/"}{system("docker tag "$0" reg.shuyan.com/k8s/"$3)}'


[root@k8s-master ~]# docker images | awk '/k8s/'
reg.shuyan.com/k8s/kube-apiserver                                 v1.30.0    c42f13656d0b   4 months ago    117MB
reg.shuyan.com/k8s/kube-controller-manager                        v1.30.0    c7aad43836fa   4 months ago    111MB
reg.shuyan.com/k8s/kube-scheduler                                 v1.30.0    259c8277fcbb   4 months ago    62MB
reg.shuyan.com/k8s/kube-proxy                                     v1.30.0    a0bf559e280c   4 months ago    84.7MB
reg.shuyan.com/k8s/etcd                                           3.5.12-0   3861cfcd7c04   7 months ago    149MB
reg.shuyan.com/k8s/coredns                                        v1.11.1    cbb01a7bd410   12 months ago   59.8MB
reg.shuyan.com/k8s/pause                                          3.9        e6f181688397   22 months ago   744kB

批量上传镜像 

[root@k8s-master ~]# docker images | awk '/k8s/{system("docker push "$1":"$2)}'

 3.5.6 修改插件服务启动参数

所有集群的机器都需要修改

由于k8s是由容器的方式运行的,所以需要找到根容器在哪里 

[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
# 仅修改这一行
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.shuyan.com/k8s/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always


[root@k8s-master ~]# systemctl daemon-reload 
[root@k8s-master ~]# systemctl start cri-docker

3.6 初始化k8s集群

方法一:通过配置文件初始化

1)生成并修改配置文件

 # 生成配置文件
 $ kubeadm config print init-defaults > kubeadm.yml

修改如下配置:

  • advertiseAddress:为控制切面地址,( Master 主机 IP )

  • criSocket:为 containerd 的 socket 文件地址

  • name: node 修改node为 master

  • imageRepository:阿里云镜像代理地址,否则拉取镜像会失败

  • kubernetesVersion:为 k8s 版本

注意:一定要配置镜像代理,否则会由于防火墙问题导致集群安装失败

修改后配置文件如下:

 apiVersion: kubeadm.k8s.io/v1beta3
 bootstrapTokens:
 - groups:
   - system:bootstrappers:kubeadm:default-node-token
   token: abcdef.0123456789abcdef
   ttl: 24h0m0s
   usages:
   - signing
   - authentication
 kind: InitConfiguration
 localAPIEndpoint:
   # 控制切面的IP地址
   advertiseAddress: 172.16.90.111
   bindPort: 6443
 nodeRegistration:
   # 容器运行时 socket 文件地址
   criSocket: unix:///var/run/containerd/containerd.sock
   imagePullPolicy: IfNotPresent
   # 控制面主机名,可省略
   name: master
   taints: 
   - effect: NoSchedule
     key: node-role.kubernetes.io/master
 ---
 apiServer:
   timeoutForControlPlane: 4m0s
 apiVersion: kubeadm.k8s.io/v1beta3
 certificatesDir: /etc/kubernetes/pki
 clusterName: kubernetes
 controllerManager: {}
 dns: {}
 etcd:
   local:
     dataDir: /var/lib/etcd
 # 镜像服务地址
 imageRepository: registry.aliyuncs.com/google_containers
 kind: ClusterConfiguration
 # K8S 版本
 kubernetesVersion: 1.24.2
 networking:
   dnsDomain: cluster.local
   # service 的网段
   serviceSubnet: 10.96.0.0/12
 scheduler: {}
 ---
 kind: KubeletConfiguration
 apiVersion: kubelet.config.k8s.io/v1beta1
 cgroupDriver: systemd

2)初始化 K8S 集群

 # 查看所需镜像列表
 $ kubeadm config images list --config kubeadm.yml
 # 拉取镜像
 $ kubeadm config images pull --config kubeadm.yml
 # 根据配置文件启动 kubeadm 初始化 k8s
 $ kubeadm init --config=kubeadm.yml --upload-certs --v=6

方法二:通过命令初始化

参数作用缺省配置
--apiserver-advertise-addressapiserver 绑定的 IPMaster 主机 IP 如果要做keepalived需要填keepalived的VIP
--apiserver-bind-portapiserver 监听的端口64436443
--cri-socketCRI socket 文件路径unix:///var/run/cri-dockerd.sock
--control-plane-endpoint控制面地址master_vip:6440
--image-repository选择拉取镜像的仓库k8s.gcr.ioreg.shuyan.com/k8s
--kubernetes-version选择K8S版本stable-11.30.0
--pod-network-cidr指定 pod 的网络10.244.0.0/16
--service-cidr指定service 的IP 范围10.96.0.0/1210.96.0.0/12

以下是初始化模版

[root@k8s-master01 ~]# kubeadm init --node-name=k8s-master01
--image-repository=registry.aliyuncs.com/google_containers
--cri-socket=unix:///var/run/cri-dockerd.sock
--apiserver-advertise-address=172.16.100.21  # 填自己的地址,假如以后做keepalived需要填VIP
--pod-network-cidr=10.244.0.0/16
--service-cidr=10.96.0.0/12

但是我使用的是自己的仓库有一些东西暂时也用不到那么多,所以简略了一些东西

3.6.1 指定仓库地址 版本号 使用与docker通讯的插件

[root@k8s-master ~]# systemctl enable --now kubelet.service 
Created symlink /etc/systemd/system/multi-user.target.wants/kubelet.service → /usr/lib/systemd/system/kubelet.service.


[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.shuyan.com/k8s \  # 指定自己仓库地址
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock

3.6.2 成功标志

底下出现这一串证明成功了

不过还需要处理一些事情,就是得指定配置文件的路径

3.6.3 指定配置文件 

master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

[root@k8s-master ~]# source ~/.bash_profile

3.6.4 查看节点状态

# 状态为NotReady当前节点没有就绪,因为还没有安装网络插件,容器没有运行

[root@k8s-master ~]# kubectl get node
NAME         STATUS     ROLES           AGE    VERSION
k8s-master   NotReady   control-plane   6m2s   v1.30.0

[root@k8s-master ~]# kubectl get pod -A
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-66d4c695bb-29qbq             0/1     Pending   0          6m11s
kube-system   coredns-66d4c695bb-6th24             0/1     Pending   0          6m11s
kube-system   etcd-k8s-master                      1/1     Running   0          6m26s
kube-system   kube-apiserver-k8s-master            1/1     Running   0          6m26s
kube-system   kube-controller-manager-k8s-master   1/1     Running   0          6m26s
kube-system   kube-proxy-4fllj                     1/1     Running   0          6m12s
kube-system   kube-scheduler-k8s-master            1/1     Running   0          6m26s

如果初始化失败需要使用reset对集群进行重置

kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock

3.7 安装flannel网络插件

官方网址

GitHub - flannel-io/flannel: flannel is a network fabric for containers, designed for Kubernetesflannel is a network fabric for containers, designed for Kubernetes - flannel-io/flannelicon-default.png?t=O83Ahttps://github.com/flannel-io/flannel

3.7.1 Flannel 介绍

Flannel 是一个为容器集群设计的虚拟网络层,它主要解决的是如何让运行在不同主机上的容器能够相互通信的问题。Flannel 可以创建一个覆盖网络(Overlay Network),使得每个节点上的容器都能通过 IP 地址直接通信,即使它们不在同一个物理网络上。

3.7.2 使用魔法将镜像下载到本地

#下载flannel的yaml部署文件
master test]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

# 拉取所需镜像
master test]# docker pull docker.io/flannel/flannel:v0.25.5
master test]# docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1

3.7.3 上传所需镜像到本地仓库

master test]# docker tag flannel/flannel:v0.25.5 \
reg.shuyan.com/flannel/flannel:v0.25.5

master test]# docker push reg.shuyan.com/flannel/flannel:v0.25.5


master test]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 \
reg.shuyan.com/flannel/flannel-cni-plugin:v1.5.1-flannel1

master test]# docker push reg.shuyan.com/flannel/flannel-cni-plugin:v1.5.1-flannel1

 

3.7.4 修改yml配置文件

需要修改成如下几行 

[root@k8s-master test]# grep -n image kube-flannel.yml 
146:        image: reg.shuyan.com/flannel/flannel:v0.25.5
173:        image: reg.shuyan.com/flannel/flannel-cni-plugin:v1.5.1-flannel1
184:        image: reg.shuyan.com/flannel/flannel:v0.25.5

3.7.5 运行并查看状态 

[root@k8s-master test]# kubectl apply -f /root/test/kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

[root@k8s-master test]# kubectl get nodes 
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   23m   v1.30.0

[root@k8s-master test]# kubectl get pod -A
NAMESPACE      NAME                                 READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-fpcns                1/1     Running   0          79s
kube-system    coredns-66d4c695bb-29qbq             1/1     Running   0          24m
kube-system    coredns-66d4c695bb-6th24             1/1     Running   0          24m
kube-system    etcd-k8s-master                      1/1     Running   0          24m
kube-system    kube-apiserver-k8s-master            1/1     Running   0          24m
kube-system    kube-controller-manager-k8s-master   1/1     Running   0          24m
kube-system    kube-proxy-4fllj                     1/1     Running   0          24m
kube-system    kube-scheduler-k8s-master            1/1     Running   0          24m

# kube-flannel 命名空间:
# Pod: kube-flannel-ds-fpcns
# 这个 Pod 是 Flannel 网络插件的一部分,
# 用于为集群中的 Pod 提供网络连接。状态为 Running,
# 并且没有重启记录,表明网络插件运行正常。

4 节点扩容(工作节点加入)

4.1 节点扩容的要求

在所有的worker节点中

确认部署好以下内容

1 禁用swap

2 安装:

  • kubelet-1.30.0

  • kubeadm-1.30.0

  • kubectl-1.30.0

  • docker-ce

  • cri-dockerd

3 修改cri-dockerd启动文件systemd添加

  • --network-plugin=cni

  • --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.9

4 启动服务

  • kubelet.service

  • cri-docker.service

以上信息确认完毕后即可加入集群

4.2 MASTER 节点上获取token

# 重新生成集群token,并复制集群的token到从节点执行
[root@k8s-master test]# kubeadm token create --print-join-command
kubeadm join 192.168.239.100:6443 --token 52llq9.31a5w9pr4set4yet --discovery-token-ca-cert-hash sha256:2a5aeaece9ad08daed2744ac6fc5b652172fd597e45022b81820085fb3c8b18a

4.3 复制到从节点指定套接字运行 

# 注意:加入集群时需要添加 --cri-socket=unix:///var/run/cri-dockerd.sock

[root@k8s-node1 ~]# kubeadm join 192.168.239.100:6443 \
--token 52llq9.31a5w9pr4set4yet \
--discovery-token-ca-cert-hash sha256:2a5aeaece9ad08daed2744ac6fc5b652172fd597e45022b81820085fb3c8b18a  \
--cri-socket=unix:///var/run/cri-dockerd.sock


[root@k8s-node2 ~]# kubeadm join 192.168.239.100:6443 \
--token 52llq9.31a5w9pr4set4yet \
--discovery-token-ca-cert-hash sha256:2a5aeaece9ad08daed2744ac6fc5b652172fd597e45022b81820085fb3c8b18a  \
--cri-socket=unix:///var/run/cri-dockerd.sock

成功!

[root@k8s-master ~]# kubectl -n kube-flannel get pods -o wide 
NAME                    READY   STATUS    RESTARTS      AGE     IP                NODE         NOMINATED NODE   READINESS GATES
kube-flannel-ds-fpcns   1/1     Running   1 (26m ago)   7h14m   192.168.239.100   k8s-master   <none>           <none>
kube-flannel-ds-mnt72   1/1     Running   0             7h2m    192.168.239.110   k8s-node1    <none>           <none>
kube-flannel-ds-xfhw7   1/1     Running   0             7h2m    192.168.239.120   k8s-node2    <none>           <none>


[root@k8s-master ~]# kubectl -n kube-flannel get pods
NAME                    READY   STATUS    RESTARTS      AGE
kube-flannel-ds-fpcns   1/1     Running   1 (27m ago)   7h15m
kube-flannel-ds-mnt72   1/1     Running   0             7h3m
kube-flannel-ds-xfhw7   1/1     Running   0             7h3m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妍妍的宝贝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值