[Kubernetes] Kubernetes基础&部署
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内核模块功能说明
- IPVS 核心模块
-
ip_vs :IPVS 负载均衡基础模块
-
ipvsrr :轮询(Round Robin)调度算法
-
ipvswrr :加权轮询(Weighted RR)调度算法
-
ipvssh :源地址哈希(Source Hashing)调度算法
- 网络连接与过滤
-
nfconntrackipv4 :IPv4 连接跟踪(NAT/防火墙依赖,新内核中内核版本 ≥4.19 时合并 至 nf_conntrack )
-
ip_tables :iptables 基础框架
-
ipt_REJECT :实现数据包拒绝(REJECT 动作)
- IP 集合管理
-
ip_set :IP 地址集合管理
-
xtset & iptset :iptables 与 IP 集合的扩展匹配
- 网络隧道与桥接
-
ipip :IP-over-IP 隧道协议
-
overlay :Overlay 网络支持(如 Docker 跨主机网络)
-
br_netfilter :桥接网络流量过滤(需配合 net.bridge.bridge-nf-call-iptables=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
更多推荐


所有评论(0)