Kubernetes是什么

  • K8S用于容器化应用程序的部署,扩展和管理。

  • K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。

  • Kubernetes目标是让部署容器化应用简单高效。

Kubernetes特性

  • 自我修复

    在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。

  • 弹性伸缩

    使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。

  • 自动部署和回滚

    K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。

  • 服务发现和负载均衡

    K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。

  • 机密和配置管理

    管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。

  • 存储编排

    挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。

  • 批处理

    提供一次性任务,定时任务;满足批量数据处理和分析的场景。

Kubernetes集群架构与组件

一个集群中master并不是越多越好,太多反而会累赘,一般3master最好,5master适中。

  • 1master+3node能跑500pod

  • 1master+5node能跑800-1000pod

  • 3master+9node能跑2500pod

  • 3master+13/(15)node能跑4000pod

  • 5master+21node能跑7000pod

API server是核心,相当于cpu

Master组件
  • Auth(认证授权)

    与 API Server 配合,对访问集群的请求进行身份验证和权限控制,保障集群安全。

  • kube-apiserver

    Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口 服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

  • kube-controller-manager

    处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager 就是负责管理这些控制器的。

  • kube-scheduler

    根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在 同一个节点上,也可以部署在不同的节点上。

  • etcd

    分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。

Node组件
  • kubelet

    kubelet是Master(中的api server)在Node节点上的Agent(代理),管理本机运行容器的生命周期,比如创 建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每 个Pod转换成一组容器。

  • kube-proxy

    在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。

  • docker或rocket

    容器引擎,负责运行容器。

  • Pod

    Kubernetes 的最小部署单元,一个 Pod 可包含一个或多个紧密关联的容器,这些容器共享网络和存储等资源。

工作流程

1. 用户发起请求

用户通过 kubectl(Kubernetes 命令行工具)等客户端工具,向集群的 API Server 发送请求,比如创建一个 Pod(容器组)、部署一个应用等。

2. API Server 处理请求

  • 认证与授权:API Server 先对请求进行身份验证(确认用户身份合法)和授权(检查用户是否有操作对应资源的权限)。

  • 与 Etcd 交互:若请求涉及资源的创建、更新等,API Server 会将资源的配置信息存储到 Etcd(分布式键值存储,保存集群所有核心配置和状态)中。

3. 调度(Scheduler)

当有新的 Pod 需要部署且未指定运行节点时,Scheduler 会监视到这种情况。它会根据节点的资源使用情况(如 CPU、内存剩余量)、Pod 的资源需求等因素,为 Pod 选择最合适的 Node(工作节点),并将调度结果告知 API Server,API Server 再把调度信息更新到 Etcd 中。

4. 控制器管理(Controller - Manager)

Controller - Manager 运行着各类控制器,比如 ReplicaSet 控制器(确保 Pod 副本数量符合预期)、Node 控制器(管理节点状态)等。这些控制器会持续监控集群状态,当实际状态与期望状态(如 Pod 数量不足)不符时,会通过 API Server 发起调整操作,让集群回到期望状态。

5. Node 上的执行

  • Kubelet:运行在目标 Node 上的 Kubelet 会通过 API Server 得知自己需要运行的 Pod 信息。然后,Kubelet 会调用容器运行时(如 Docker),在 Node 上创建并启动 Pod 里的容器。同时,Kubelet 会持续监控容器的运行状态,若有异常(如容器崩溃),会尝试重启等操作。

  • Kube - proxy:运行在 Node 上的 Kube - proxy 负责网络相关工作。它会维护网络规则,实现 Pod 之间的通信,以及外部(如互联网通过防火墙后)对 Pod 所属服务(Service)的访问,比如为 Service 提供负载均衡等能力,让流量能正确转发到后端的 Pod 上。

版本区别

部署方式·其一:docker进行时

前置环境部署

主机配置

配置主机名解析
vim /etc/hosts
#添加
192.168.100.128 master
192.168.100.129 node1
192.168.100.136 node2
安装环境包
yum -y install vim lrzsz unzip wget net-tools tree bash-completion conntrack ntpdate ntp ipvsadm ipset iptables curl sysstat libseccomp git psmisc telnet unzip gcc gcc-c++ make
关闭防火墙和内核安全机制
systemctl disable firewalld --now
sed -i 's/enforcing/disabled/g' /etc/selinux/config
setenforce 0
关闭swap分区
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
mount -a
关闭NetworkManager(可选)
systemctl stop NetworkManager
systemctl disable NetworkManager
升级内核
yum update -y kernel && reboot
调整系统内核参数
[root@master ~]# cat >/etc/sysctl.d/kubernetes.conf<<EOF
# 开启Linux内核的网络桥接功能,同时启用iptables和ip6tables的网络包过滤功能,用于在网络桥接时进行网络包过滤
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 开启路由转发,转发IPv4的数据包
net.ipv4.ip_forward=1
# 尽可能避免使用交换分区,提升k8s性能
vm.swappiness=0
# 不检查物理内存是否够用
vm.overcommit_memory=1
EOF

#立即生效
sysctl --system
调整Linux资源限制(可选)
//设置一个进程可以打开的最大文件句柄数
[root@master ~]# ulimit -SHn 65535
//在Linux系统中,默认情况下一个进程可以打开的最大文件句柄数是1024
[root@master ~]# cat >> /etc/security/limits.conf <<EOF
# 为所有用户设置文件描述符软限制
* soft nofile 655360
# 为所有用户设置文件描述符硬限制
* hard nofile 131072
# 为所有用户设置进程数软限制
* soft nproc 655350
# 为所有用户设置进程数硬限制
* hard nproc 655350
# 为所有用户设置内存锁定软限制为无限制
* soft memlock unlimited
# 为所有用户设置内存锁定硬限制为无限制
* hard memlock unlimited
EOF
时间同步
yum -y install chrony
systemctl restart chronyd
#列出 Chrony 守护进程当前配置和使用的所有时间源(NTP 服务器)及其同步状态信息
chronyc sources -v
#将硬件时钟的时间同步到系统时钟
hwclock -s
IPVS
cat >>/etc/modules-load.d/ipvs.conf<<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
overlay
br_netfilter
EOF

#重启服务
systemctl restart systemd-modules-load
#查看内核模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

IPVS内核模块功能说明

  1. IPVS 核心模块
  • ip_vs :IPVS 负载均衡基础模块

  • ipvsrr :轮询(Round Robin)调度算法

  • ipvswrr :加权轮询(Weighted RR)调度算法

  • ipvssh :源地址哈希(Source Hashing)调度算法

  1. 网络连接与过滤
  • nfconntrackipv4 :IPv4 连接跟踪(NAT/防火墙依赖,新内核中内核版本 ≥4.19 时合并 至 nf_conntrack )

  • ip_tables :iptables 基础框架

  • ipt_REJECT :实现数据包拒绝(REJECT 动作)

  1. IP 集合管理
  • ip_set :IP 地址集合管理

  • xtset & iptset :iptables 与 IP 集合的扩展匹配

  1. 网络隧道与桥接
  • ipip :IP-over-IP 隧道协议

  • overlay :Overlay 网络支持(如 Docker 跨主机网络)

  • br_netfilter :桥接网络流量过滤(需配合 net.bridge.bridge-nf-call-iptables=1 参 数)

  1. 反向路径过滤

ipt_rpfilter :反向路径验证(防 IP 欺骗)

典型应用场景

  • Kubernetes 节点初始化 :IPVS 模式 kube-proxy 依赖这些模块

  • 负载均衡服务器 :启用 IPVS 调度算法

  • 容器网络配置 :Overlay 和桥接模块支持

docker-ce环境

前置环境安装
yum install -y yum-utils device-mapper-persistent-data lvm2
使用阿里云镜像
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker-ce
yum install -y docker-ce
启动docker服务
systemctl enable --now docker
镜像加速
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com",
    "https://do.nark.eu.org",
    "https://dc.j8.work",
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.nju.edu.cn",
    "https://registry.docker-cn.com",
    "https://hub-mirror.c.163.com",
    "https://hub.uuuadc.top",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu",
    "https://docker.ckyl.me",
    "https://docker.awsl9527.cn",
    "https://mirror.baidubce.com",
    "https://docker.1panel.live"
    ]
}
EOF
修改cgroup
vim /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://05vz3np5.mirror.aliyuncs.com",
    "https://do.nark.eu.org",
    "https://dc.j8.work",
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.nju.edu.cn",
    "https://registry.docker-cn.com",
    "https://hub-mirror.c.163.com",
    "https://hub.uuuadc.top",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu",
    "https://docker.ckyl.me",
    "https://docker.awsl9527.cn",
    "https://mirror.baidubce.com",
    "https://docker.1panel.live"
    ], #注意分隔符号
  "exec-opts": ["native.cgroupdriver=systemd"] #添加cgroup方式
}

cri-dockerd安装

作用:cri-dockerd 的主要作用是为 Docker Engine 提供一个符合 Kubernetes CRI(Container Runtime Interface)标准的接口 ,使 Docker 能继续作为 Kubernetes 的容器运行时(Container Runtime),尤其是在 Kubernetes1.24版本后,官方移除对原生 Docker 支持(dockershim)之后。

安装
#下载
wget https://github.com/mirantis/cridockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.e17.x86_64.rpm

下载完成后直接安装

rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm
编辑服务配置文件
vim /usr/lib/systemd/system/cri-docker.service
#编辑第10行,中间添加 --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd://
启动cri-dockerd服务
systemctl daemon-reload
systemctl start cri-docker.service
systemctl enable cri-docker.service

#检查是否启动
ls /run/cri-*

kubernetes集群部署

Yum源
cat <<EOF>/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
软件安装

查看可安装的版本

yum list kubeadm.x86_64 --showduplicates | sort -r

安装1.28.2-0版本

yum install -y kubeadm-1.28.0-0 kubelet-1.28.0-0 kubectl-1.28.0-0
kubelet配置

强制指定 kubelet 使用 systemd 作为 cgroup 驱动,确保与 Docker 或其他容器运行时保持一致

将 kube-proxy 的代理模式设置为 ipvs ,替代默认的 iptables ,提升大规模集群的网络性能

vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

#服务开机自启(并不立刻启动)
systemctl daemon-reload
systemctl enable kubelet.service
集群初始化

该部分操作仅在master节点操作

查看可使用镜像

kubeadm config images list --kubernetes-version=v1.28.0 --image-repository=registry.aliyuncs.com/google_containers

镜像下载

kubeadm config images pull --cri-socket=unix:///var/run/cri-dockerd.sock --kubernetes-version=v1.28.0 --image-repository=registry.aliyuncs.com/google_containers

创建初始化集群配置文件

kubeadm config print init-defaults > kubeadm-init.yaml

修改初始化配置文件

vim kubeadm-init.yaml
#注意格式!
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.18.128    #12行 master的IP地址
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock    #15行 修改docker运行时
  imagePullPolicy: IfNotPresent
  name: master    #17行 修改master节点主机名
  taints:    #18行 去掉 Null
  - effect: NoSchedule    #19行 添加污点
    key: node-role.kubernetes.io/control-plane    #20行 添加
---
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    #32行 修改镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.28.0    #34行 k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12    ##(k8s内部集群的地址,不用修改)
  podSubnet: 10.244.0.0/16    #38行 增加Pod网段
scheduler: {}
---    #末尾添加 更改kube-proxy的代理模式,默认为iptables
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---    #更改kubelet cgroup驱动为systemd
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

初始化完成

kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log

#复制下来
kubeadm join 192.168.18.128:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:539ffaea1ed0292dd4a295e53f5f3150aea818d18b8945f1f6c2eff6e9728601
配置kubectl工具

根据初始化成功后的提示进行配置

Kubectl 是一个用于操作Kubernetes集群的命令行工具。

kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。可以通过设置 KUBECONFIG 环境 变量或设置 --kubeconfig 参数来指定其它 kubeconfig 文件。

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

临时生效(退出当前窗口重连环境变量失效)

export KUBECONFIG=/etc/kubernetes/admin.conf

永久生效(推荐)

在Kubernetes集群中,admin.conf 文件是用于配置kubectl工具访问Kubernetes集群的客户端配置文 件。该文件包含了连接到Kubernetes集群所需的认证信息、集群信息和上下文信息。

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

检查核心组建控制平面的健康状态

kubectl get cs

node工作节点加入集群

以下操作仅在node节点操作

node1加入集群(node2同操作)
#此处的token等内容使用的是初始化后复制的内容
kubeadm join 192.168.18.128:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:539ffaea1ed0292dd4a295e53f5f3150aea818d18b8945f1f6c2eff6e9728601 \
--cri-socket unix:///var/run/cri-dockerd.sock

查看集群状态(在master上)
kubectl get nodes

网络CNI组建部署

此时coredns中一直没有IP地址,主要原因缺少网络组建

[root@master ~]# kubectl get pods -n kube-system -o wide

kubernetes集群的网络是比较复杂的,不是集群内部实现的,为了更方便的使用集群,因此,使用第三 方的cni网络插件(Container Network Interface )。cni是容器网络接口,作用是实现容器跨主机网络 通信。pod的ip地址段,也称为cidr。

kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择 Calico。

calico是一个纯三层的网络解决方案,为容器提供多node间的访问通信,calico将每一个node节点都当

做为一个路由器(router),每个pod都是虚拟路由器下的的终端,各节点通过BGP(Border Gateway

Protocol) 边界网关协议学习并在node节点生成路由规则,从而将不同node节点上的pod连接起来进行

通信,是目前Kubernetes主流的网络方案。

kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择 Calico。

calico是一个纯三层的网络解决方案,为容器提供多node间的访问通信,calico将每一个node节点都当 做为一个路由器(router),每个pod都是虚拟路由器下的的终端,各节点通过BGP(Border Gateway Protocol) 边界网关协议学习并在node节点生成路由规则(因为pod一直在变),从而将不同node节点上的pod连接起来进行 通信,是目前Kubernetes主流的网络方案。

官方下载地址:https://docs.tigera.io/calico

calico.yaml文件每个版本都有区别的,需要满足对应的k8s 版本

下载calico文件
[root@master ~]# wget --no-check-certificate https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
修改calico文件
[root@master ~]# vim calico.yaml
#修改4601行,去掉注释并修改(注意需要与podsubnet的ip吻合)
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"

部署Calico

注意:需要等待较长时间下载相关组建,主要看网络环境

kubectl apply -f calico.yaml

可以通过以下命令查看进程

watch kubectl get pods -n kube-system

出现

全部显示running即为成功

查看集群状态

优化操作

kubectl命令补全

yum install bash-completion -y
source /usr/share/bash-completion/bash_completion

在当前bash环境中永久设置命令补全

echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

测试操作

创建应用服务nginx

[root@master ~]# kubectl create deployment nginx --image=nginx --replicas=3
deployment.apps/nginx created
[root@master ~]# kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort 
service/nginx exposed

查看pod和service信息

默认情况下,master节点存在污点,不接受任何pod资源调度

[root@master ~]# kubectl get pod,svc

测试访问

注意:关闭node节点防火墙

内部(80端口)

外部(32219端口),浏览器输入地址:nodeIP:port 则可以看到nginx测试页面

自我修复测试

k8s的一大特征就是具备自我修复功能,当一个pod被删除时或损坏时会自动创建一个新的pod

#删除一个pod
kubectl delete pod nginx-7854ff8877-4vf7z

此时会发现pod被自动创建了,并且ip也发生了变化,新的ip会被自动绑定到后端池

删除

因为存在自我修复特性,所以删除pod没有用,而是要删除控制器

kubectl get deployments
kubectl delete deployment nginx
kubectl get svc
kubectl delete svc nginx

部署方法·其二:containerd进行时

1:升级内核(两个内核rpm包上传到服务器中再执行)
# 下载内核软件包
wget -c http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-6.5.5-1.el7.elrepo.x86_64.rpm
wget -c http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-6.5.5-1.el7.elrepo.x86_64.rpm

yum localinstall -y kernel-ml-*

#查看系统已安装的内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg
##显示
0 : CentOS Linux (6.5.5-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-de2f0c2376984509aa23f7bb88e529cf) 7 (Core)

#设置grub2默认引导加载程序,用于启动操作系统
grub2-set-default 0

#重新生成grub引导文件
grub2-mkconfig -o /boot/grub2/grub.cfg

#重启系统
reboot

#查看内核版本
uname -r
##显示
6.5.5-1.el7.elrepo.x86_64
2:设置系统主机名和hosts文件
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

cat >>/etc/hosts<<EOF
192.168.18.128 k8s-master
192.168.18.129 k8s-node01
192.168.18.130 k8s-node02
EOF
3:安装环境包
yum -y install vim lrzsz unzip wget net-tools tree bash-completion \
conntrack ntpdate ntp ipvsadm ipset iptables \
curl sysstat libseccomp git psmisc telnet unzip gcc gcc-c++ make
4:关闭防火墙和内核安全机制
systemctl disable firewalld --now
sed -i 's/enforcing/disabled/g' /etc/selinux/config
setenforce 0
5:关闭swap分区

启用swap分区会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap分区

swapoff -a && sed -i '/swap/s/^/#/'  /etc/fstab
6:关闭NetworkManager(可选)
systemctl stop NetworkManager
systemctl disable NetworkManager
7:调整系统内核参数
cat >/etc/sysctl.d/kubernetes.conf<<EOF
# 开启Linux内核的网络桥接功能,同时启用iptables和ip6tables的网络包过滤功能,用于在网络桥接时进行网络包过滤
net.bridge.bridge-nf-call-iptables=1     
net.bridge.bridge-nf-call-ip6tables=1
# 开启路由转发,转发IPv4的数据包
net.ipv4.ip_forward=1
# 尽可能避免使用交换分区,提升k8s性能
vm.swappiness=0
# 不检查物理内存是否够用
vm.overcommit_memory=1                   
EOF

# 立即生效
sysctl --system
8:调整Linux资源限制(可选)
# 设置一个进程可以打开的最大文件句柄数
ulimit -SHn 65535

# 在Linux系统中,默认情况下一个进程可以打开的最大文件句柄数是1024
cat >> /etc/security/limits.conf <<EOF
# 为所有用户设置文件描述符软限制
* soft nofile 655360
# 为所有用户设置文件描述符硬限制
* hard nofile 131072
# 为所有用户设置进程数软限制
* soft nproc 655350
# 为所有用户设置进程数硬限制
* hard nproc 655350
# 为所有用户设置内存锁定软限制为无限制
* soft memlock unlimited
# 为所有用户设置内存锁定硬限制为无限制
* hard memlock unlimited      
EOF
9:配置时间同步
yum -y install chrony
systemctl restart chronyd
chronyc sources -v
hwclock -s                    #将硬件时钟的时间同步到系统时钟
10:配置IPVS功能
#安装依赖
yum -y install ipvsadm ipset sysstat conntrack libseccomp

# 添加ipvs模块和内核模块
cat >>/etc/modules-load.d/ipvs.conf<<EOF 
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4      #内核4.19以上版本设置为nf_conntrack(注释记得删掉)
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
overlay
br_netfilter
EOF
# 重启服务
systemctl restart systemd-modules-load

# 查看内核模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 

Linux内核4.19+版本已经将nfconntrackipv4更新为nf_conntrack。

nf_conntrack是Linux内核中用于连接跟踪的模块,它负责跟踪网络连接的状态,包括连接的建立、维护和终止,以及相关的网络数据包的处理。这个模块在防火墙、网络地址转换(NAT)、负载均衡等网络功能中起着重要作用。

11:安装containerd软件

(注意:k8s v1.24 版本以后放弃对Docker Engine的支持,而采用containerd容器进行时。)

containerd 是一个高级容器运行时,又名容器管理器。简而言之,它是一个守护进程,在单个主机上管理整个容器生命周期:创建、启动、停止容器、拉取和存储镜像、配置装载、网络等。

containerd 被设计为易于嵌入到更大的系统中。Docker 引擎使用 containerd 来运行容器。Kubernetes 可以通过 CRI 使用 containerd 来管理单个节点上的容器。

# 指定 containerd 在系统启动时加载的内核模块
cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

# 加载模块
modprobe overlay
modprobe br_netfilter

# 立即生效
sysctl --system

# 安装依赖的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加 Docker 软件源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast

# 查看containerd版本
yum list containerd.io --showduplicates | sort -r

# 安装指定版本containerd
yum -y install containerd.io-1.6.16

# 生成containerd的配置文件
mkdir -p /etc/containerd
containerd config default >/etc/containerd/config.toml

# 修改containerd的驱动程序
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml

# 修改镜像仓库地址
vim /etc/containerd/config.toml
//61行
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

# 启动containerd
systemctl enable containerd
systemctl start containerd
systemctl status containerd

# 查看containerd版本
ctr version
1.6.16

12:镜像加速配置
vim /etc/containerd/config.toml
# 145行
[plugins."io.containerd.grpc.v1.cri".registry]
  config_path = "/etc/containerd/certs.d"

#创建该目录
mkdir /etc/containerd/certs.d
mkdir /etc/containerd/certs.d/docker.io
vim /etc/containerd/certs.d/docker.io/hosts.toml
#写入
server = "https://docker.io"
[host."https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com"]
  capabilities = ["pull","resolve","push"]

[host."https://hub-mirror.c.163.com"]
  capabilities = ["pull","resolve","push"]

[host."https://do.nark.eu.org"]
  capabilities = ["pull","resolve","push"]

[host."https://dc.j8.work"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull","resolve","push"]

[host."https://dockerproxy.com"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.mirrors.ustc.edu.cn"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.nju.edu.cn"]
  capabilities = ["pull","resolve","push"]

[host."https://registry.docker-cn.com"]
  capabilities = ["pull","resolve","push"]

[host."https://hub.uuuadc.top"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.anyhub.us.kg"]
  capabilities = ["pull","resolve","push"]

[host."https://dockerhub.jobcher.com"]
  capabilities = ["pull","resolve","push"]

[host."https://dockerhub.icu"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.ckyl.me"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.awsl9527.cn"]
  capabilities = ["pull","resolve","push"]

[host."https://mirror.baidubce.com"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.1panel.live"]
  capabilities = ["pull","resolve","push"]


# 启动containerd
systemctl enable containerd
systemctl start containerd
systemctl status containerd

# 查看containerd版本
ctr version
1.6.16

测试下载

ctr images pull docker.io/library/httpd:latest --hosts-dir=/etc/containerd/certs.d
# 查看镜像
ctr i ls

13:安装kubeadm
# 添加k8s软件源
cat <<EOF>/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 快速建立yum缓存
yum makecache fast

# 查看k8s版本
yum list kubectl --showduplicates | sort -r

# 安装指定版本k8s
yum -y install kubectl-1.28.0 kubelet-1.28.0 kubeadm-1.28.0

# kubelet使用systemd来作为cgroup驱动,使系统运行稳定,限制Pod和容器的资源使用情况,如cpu、内存等。
# 注意:k8s v1.22开始,使用 kubeadm 创建集群时,默认使用systemd为cgroup驱动程序;
# 修改kubelet的crgoup与containerd的crgoup保持一致
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

# kubelet设置为开机自启动
systemctl daemon-reload
systemctl enable kubelet

# 查看k8s版本
kubelet --version 或 kubeadm version

各工具包作用

kubeadm:快速部署kubernetes集群的工具

kubelet:在集群中的每个节点上用来启动Pod和容器等

kubectl:负责管理kubernetes集群的命令行工具

14:配置crictl工具

crictl 是CRI兼容的容器运行时命令行接口,可以使用它来检查和调试kubelet节点上的容器运行时和镜像

# 设置crictl连接containerd
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
15:主节点部署Kubernetes

该部分操作仅在master节点操作

# 查看k8s集群所需要的镜像
[root@k8s-master ~]# kubeadm config images list --kubernetes-version=v1.28.0 \
--image-repository=registry.aliyuncs.com/google_containers

# 下载k8s集群所需要的镜像(需耐心等待)
[root@k8s-master ~]# kubeadm config images pull --kubernetes-version=v1.28.0 \
--image-repository=registry.aliyuncs.com/google_containers

# 查看k8s集群所有的镜像
[root@k8s-master ~]# crictl images ls

初始化集群自动开启IPVS:

创建初始化集群配置文件

kubeadm config print init-defaults > kubeadm-init.yaml

修改初始化集群配置文件

[root@k8s-master ~]# vim kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.18.128   #12行 修改master节点ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock   #15行 修改容器进行时
  imagePullPolicy: IfNotPresent
  name: k8s-master                   #17行 修改master节点主机名
  taints:                                        #18行  注意!去掉Null
  - effect: NoSchedule               #19行 添加污点
    key: node-role.kubernetes.io/control-plane     #20行 添加
---
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    #32行 修改镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.28.0            #34行 修改k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16           #38行 增加pod网段
scheduler: {}

# 末尾添加
---                                  #更改kube-proxy的代理模式,默认为iptables
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---                                  #更改kubelet cgroup驱动为systemd
apiVersion: kubelet.config.k8s.io/v1beta1 
kind: KubeletConfiguration
cgroupDriver: systemd

初始化集群

kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log

kubeadm join 192.168.18.128:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:1d371dad3f8ee44b940a764b321ddd1c2c686e655be1ff10a2c627ce67ce4f39

*如果集群初始化失败,重置处理如下:

# 删除kubernetes目录中所有内容
rm -rf /etc/kubernetes/*
# 删除启动端口进程
pkill -9 kubelet
pkill -9 kube-controll
pkill -9 kube-schedule
# 重置sock文件()
16:配置kubectl工具(根据初始化成功后的提示进行配置)

该部分操作仅在master节点操作

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 临时生效(退出当前窗口重连环境变量失效)
export KUBECONFIG=/etc/kubernetes/admin.conf

# 永久生效(推荐)
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source  ~/.bash_profile
17:查看组建状态
kubectl get cs

18:node工作节点加入集群

该部分操作仅在node节点操作

#在两个node节点上执行
kubeadm join 192.168.18.128:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:1d371dad3f8ee44b940a764b321ddd1c2c686e655be1ff10a2c627ce67ce4f39
19:查看集群节点状态

此时,k8s内部不具备网络功能,因此节点信息都是 “Not Ready” 状态

20:部署网络CNI组建

kubernetes集群的网络是比较复杂的,不是集群内部实现的,为了更方便的使用集群,因此,使用第三方的cni网络插件(Container Network Interface )。cni是容器网络接口,作用是实现容器跨主机网络通信。pod的ip地址段,也称为cidr。

kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择 Calico。

calico是一个纯三层的网络解决方案,为容器提供多node间的访问通信,calico将每一个node节点都当做为一个路由器(router),每个pod都是虚拟路由器下的的终端,各节点通过BGP(Border Gateway Protocol) 边界网关协议学习并在node节点生成路由规则,从而将不同node节点上的pod连接起来进行通信,是目前Kubernetes主流的网络方案。

# 下载Calico文件
[root@k8s-master ~]# wget --no-check-certificate https://docs.tigera.io/archive/v3.25/manifests/calico.yaml

# 修改Calico文件
[root@k8s-master ~]# vim calico.yaml
# 找到4601行,去掉注释并修改
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"

# 部署Calico
[root@k8s-master ~]# kubectl apply -f calico.yaml

如果拉去时一直显示ImagePullBackOff:

#使用下面命令删除
kubectl delete -f calico.yaml
#再重新部署
kubectl apply -f calico.yaml

验证检查

全部显示running即代表成功

kubectl get pods -A
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐