Kubernetes介绍和部署

Kubernetes(K8s)

Kubenetes 介绍

Kubernetes 是什么

Kubernetes 是一个 自动化管理容器的系统。其中docker 负责将应用装进容器中,k8s就是负责管理成百上千个容器的工具。

如果不用 K8s,你会遇到这些问题:

  • 容器挂了,谁来重启?
  • 服务器满了,怎么自动换一台?
  • 流量突然暴涨,怎么多启动几个容器?
  • 更新程序时,怎么做到不停机?

k8s可以帮你解决以上问题!!

Kubernetes 作用

  • 自动部署:能够自动启动容器
  • 自动修复:当容器挂了能自动重启
  • 自动扩缩容:流量大时多启动几个容器,流量小时停掉部分容器
  • 服务发现:容器的IP变化后也能访问服务
  • 负载均衡:高并发时请求自动分给多个容器
  • 滚动更新:升级不中断业务

所以,可以把k8s看作是"容器世界的自动化运维管家"

Kubernetes 架构

集群(cluster)

Kubernetes 是 以集群形式工作的

Kubernetes 集群

├── 控制平面(Master / Control Plane):管理,发号施令

└── 工作节点(Worker Node):干活,跑容器

其中核心组件包括:

控制平面:API Server、Scheduler、Controller-manager、ETCD

工作节点:Kubelet、kube-proxy、container-runtime

控制节点
API Server(核心入口)

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

Scheduler(调度器)

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

它会考虑:

  • 哪台节点资源够
  • 有没有特殊要求(标签、亲和性)
  • 哪台最合适
Controller Manager(控制器管理器)

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

比如,请求给api server要3个资源,实际给了2个,此时controller manager 发现后向 api server 发送请求再要1个

etcd(集群大脑 / 数据库)

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

里面存的都是:

  • Pod 信息
  • 节点信息
  • 配置、密钥、状态

注意:etcd挂了,那么集群基本废了

工作节点
kubelet(master在节点的代理)

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

容器运行时(Container Runtime)

真正运行容器的程序

kube-proxy(网络代理)

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

能够不需要去记忆每个pod提供服务的IP地址,即使容器IP改变依然可以访问服务

Kubernetes 核心对象

Pod
  • 最小部署单元
  • 一组容器的集合(一个或多个容器)
  • 一个Pod中容器共享网络命名空间
  • Pod时短暂的

k8s不直接管理容器,管理Pod

Controllers
  • ReplicaSet : 确保预期的Pod副本数量
  • Deployment : 无状态应用部署
  • StatefulSet : 有状态应用部署
  • DaemonSet : 确保所有Node运行同一个Pod
  • Job : 一次性任务
  • Cronjob : 定时任务
Service

服务访问入口,给一组 Pod 提供一个 稳定访问地址

  • 防止Pod失联
  • 定义一组Pod的访问策略(Pod IP变化和Pod增减)

Service 一直不变

Kubernetes 完整工作流程

当你执行一条命令

bash 复制代码
kubectl apply -f deployment.yaml
  1. kubectl
    • 把 YAML 发给 API Server
  2. API Server
    • 校验请求
    • 把期望状态写入 etcd
  3. Controller Manager
    • 发现"需要 3 个 Pod"
    • 创建 Pod 对象
  4. Scheduler
    • 给 Pod 选择最合适的 Node
  5. kubelet(Node 上)
    • 拉镜像
    • 创建容器
    • 启动 Pod
  6. kube-proxy
    • 配置网络规则
    • Service 可以访问 Pod

Kubernetes 部署

在部署之前我们来看看K8s的版本发展故事

所以我们接下来分别部署最新的默认支持containerd的1.28版本,以及部署一个对接docker的1.28版本

k8s-1.28-containerd

环境准备

使用CentOS7-tpl准备三台节点,master和2台node节点

主机名 作用
k8s-master 管理节点
k8s-node01 工作节点
k8s-node02 工作节点
部署流程

所有节点操作

升级内核

bash 复制代码
# 普通升级内核
yum update -y kernel && reboot

# 查看内核版本
uname -r

设置系统主机名和hosts文件

bash 复制代码
# 设置主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

# 修改hosts文件
# 末尾加入
192.168.108.128 k8s-master
192.168.108.129 k8s-node01
192.168.108.136 k8s-node02

安装软件包

bash 复制代码
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

关闭防火墙和SELinux

bash 复制代码
# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld

# 关闭SELinux
sed -i 's/enforcing/disabled/g' /etc/selinux/config
setenforce 0

关闭swap分区

bash 复制代码
# 启用swap分区会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap分区
swapoff -a && sed -i '/swap/s/^/#/'  /etc/fstab

关闭NetworkManager(可选)

bash 复制代码
systemctl stop NetworkManager
systemctl disable NetworkManager

调整系统内核参数

bash 复制代码
vim /etc/sysctl.d/kubernetes.conf
# 开启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  

# 立即生效
sysctl --system

配置时间同步

bash 复制代码
yum -y install chrony
systemctl restart chronyd
chronyc sources -v
hwclock -s		#将硬件时钟的时间同步到系统时钟

配置IPVS功能

经典应用场景:

  • Kubernetes 节点初始化 :IPVS 模式 kube-proxy 依赖这些模块
  • 负载均衡服务器 :启用 IPVS 调度算法
  • 容器网络配置 :Overlay 和桥接模块支持
bash 复制代码
yum -y install ipvsadm ipset sysstat conntrack libseccomp
# 已安装

vim /etc/modules-load.d/ipvs.conf
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

# 重启服务
systemctl restart systemd-modules-load

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

IPVS内核模块功能说明:

  1. IPVS核心模块
    • ip_vs :IPVS 负载均衡基础模块
    • ip_vs_rr :轮询(Round Robin)调度算法
    • ip_vs_wrr :加权轮询(Weighted RR)调度算法
    • ip_vs_sh :源地址哈希(Source Hashing)调度算法
  2. 网络连接与过滤
    • nf_conntrack_ipv4 :IPv4 连接跟踪(NAT/防火墙依赖,新内核中内核版本 ≥4.19 时合并至 nf_conntrack )
    • ip_tables :iptables 基础框架
    • ipt_REJECT :实现数据包拒绝(REJECT 动作)
  3. IP 集合管理
    • ip_set :IP 地址集合管理
    • xt_set & ipt_set :iptables 与 IP 集合的扩展匹配
  4. 网络隧道与桥接
    • ipip :IP-over-IP 隧道协议
    • overlay :Overlay 网络支持(如 Docker 跨主机网络)
    • br_netfilter :桥接网络流量过滤(需配合 net.bridge.bridge-nf-call-iptables=1 参数)
  5. 反向路径过滤
    • ipt_rpfilter :反向路径验证(防 IP 欺骗)

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

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

安装containerd

Kubernetes 可以通过 CRI 使用 containerd 来管理单个节点上的容器

bash 复制代码
# 指定 containerd 在系统启动时加载的内核模块
vim /etc/modules-load.d/containerd.conf
overlay
br_netfilter

# 加载模块
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
# 更推荐根据Kubernetes的版本、生产环境的成熟度以及系统兼容性来选择最合适的containerd版本
yum -y install containerd.io-1.6.16

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

# 修改containerd的驱动程序
vim /etc/containerd/config.toml
 61 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
125 SystemdCgroup = true

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

# 查看containerd版本
ctr version
1.6.16

配置镜像加速

bash 复制代码
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
145   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

测试下载镜像

bash 复制代码
ctr images pull docker.io/library/httpd:latest --hosts-dir=/etc/containerd/certs.d

# 查看镜像
ctr i ls

kubernetes集群部署

安装kubeadm、kubectl、kubelet

bash 复制代码
# 添加k8s软件源
vim /etc/yum.repo.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

# 快速建立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保持一致

bash 复制代码
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

设置kubelet开机自启动

bash 复制代码
systemctl daemon-reload
systemctl enable kubelet

各工具包作用:

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

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

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

查看k8s版本

bash 复制代码
kubelet --version
# 或者
kubeadm version

配置crictl工具

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

bash 复制代码
vim /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false

在master节点操作

控制节点部署kubernetes

bash 复制代码
# 查看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
IMAGE                                                             TAG                 IMAGE ID            SIZE
registry.aliyuncs.com/google_containers/coredns                   v1.10.1             ead0a4a53df89       16.2MB
registry.aliyuncs.com/google_containers/etcd                      3.5.9-0             73deb9a3f7025       103MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.28.0             bb5e0dde9054c       34.6MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.28.0             4be79c38a4bab       33.4MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.28.0             ea1030da44aa1       24.6MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.28.0             f6f496300a2ae       18.8MB
registry.aliyuncs.com/google_containers/pause                     3.9                 e6f1816883972       322kB

初始化集群自动开启IPVS

bash 复制代码
# 创建初始化集群配置文件
[root@k8s-master ~]# kubeadm config print init-defaults > kubeadm-init.yaml

# 修改初始化集群配置文件
[root@k8s-master ~]# vim kubeadm-init.yaml
 12 advertiseAddress: 192.168.108.141		# 修改master节点IP
 15 criSocket: unix:///var/run/containerd/containerd.sock		# 修改容器进行时
 17 name: k8s-master			# 修改master节点主机名
 18   taints:					# 去掉Null,并添加19 20行
 19   - effect: NoSchedule		# 添加污点(不在该节点上创建资源)[亲和:优先在此节点上创建资源]
 20     key: node-role.kubernetes.io/control-plane		# 'control-plane'看见就知道该节点是master
 32 imageRepository: registry.aliyuncs.com/google_containers	# 修改镜像仓库地址
 34 kubernetesVersion: 1.28.0	# 修改k8s版本
 37 serviceSubnet: 10.96.0.0/12
 38 podSubnet: 10.244.0.0/16	# 增加pod网段
 # 末尾添加
 ---
 apiVersion: kubeproxy.config.k8s.io/v1alpha1
 kind: KubeProxyConfiguration
 mode: ipvs
 ---
 apiVersion: kubelet.config.k8s.io/v1beta1
 kind: KubeletConfiguration
 cgroupDriver: systemd

初始化集群

bash 复制代码
[root@k8s-master ~]# kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log
# 将初始化的输出内容写进kubeadm-init.log中,里面有我们后面添加node节点所需要的命令
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:
# 此处添加admin.conf配置文件起添加认证指向master节点,方便与api-server通信,用于kubelet工具访问集群的客户端配置
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:
# 用于设置环境变量来指定其他kubeconfig文件
  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:
# 该命令用于加入其他节点进入集群
# 通过kubelet向api-server申请证书,api-server会联合ca进行认证并颁发证书
kubeadm join 192.168.108.128:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:7aa3604a266bdb23d52776d205ec8a69758ff75d949ed06bdbb116f84e410a26

kubernetes文件说明:

bash 复制代码
[root@master ~]# tree /etc/kubernetes/
/etc/kubernetes/
├── admin.conf
├── controller-manager.conf
├── kubelet.conf
├── manifests
│   ├── etcd.yaml
│   ├── kube-apiserver.yaml
│   ├── kube-controller-manager.yaml
│   └── kube-scheduler.yaml
├── pki
│   ├── apiserver.crt
│   ├── apiserver-etcd-client.crt
│   ├── apiserver-etcd-client.key
│   ├── apiserver.key
│   ├── apiserver-kubelet-client.crt
│   ├── apiserver-kubelet-client.key
│   ├── ca.crt
│   ├── ca.key
│   ├── etcd
│   │   ├── ca.crt
│   │   ├── ca.key
│   │   ├── healthcheck-client.crt
│   │   ├── healthcheck-client.key
│   │   ├── peer.crt
│   │   ├── peer.key
│   │   ├── server.crt
│   │   └── server.key
│   ├── front-proxy-ca.crt
│   ├── front-proxy-ca.key
│   ├── front-proxy-client.crt
│   ├── front-proxy-client.key
│   ├── sa.key
│   └── sa.pub
└── scheduler.conf

后缀为.conf,是配置文件

manifests目录下,后缀为.yaml,是组件资源创建脚本,是集群中各个组件的Pod配置文件,当Kubernetes集群启动时,kubelet会自动监视/etc/kubernetes/manifests/目录下的配置文件,并根据这些配置文件创建和管理对应的Pod

  • etcd.yaml:用于部署和管理etcd集群的配置文件
  • kube-apiserver.yaml:用于部署和管理Kubernetes API服务器的配置文件
  • kube-controller-manager.yaml:用于部署和管理Kubernetes控制器管理器的配置文件
  • kube-scheduler.yaml:用于部署和管理Kubernetes调度器的配置文件

pki目录下,是k8s的集群证书

如果集群初始化失败

bash 复制代码
# 查看日志解决
journalctl -xeu kubelet
# 或者
tail kubeadm-init.log

# 重置处理
# 1.删除kubernetes目录中所有内容
rm -rf /etc/kubernetes/*

# 2.删除启动端口进程
pkill -9 kubelet
pkill -9 kube-controll
pkill -9 kube-schedule

# 3.重置sock文件
kubeadm reset -f --cri-socket=unix:///var/run/containerd/containerd.sock

# 也许是前面的步骤有遗漏或者出错的地方

# 查看kube-proxy代理模式
curl localhost:10249/proxyMode

配置kubectl工具(根据初始化成功后的提示进行配置)

就是看刚才写入kubeadm-init.log中的内容

bash 复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo 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

通过https 协议管理k8s集群

查看组件状态

bash 复制代码
[root@k8s-master ~]# kubectl get cs
# 或者kubectl get pods -n kube-system
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE   ERROR
controller-manager   Healthy   ok        
scheduler            Healthy   ok        
etcd-0               Healthy   ok

node节点

node工作节点加入集群

bash 复制代码
# 根据初始化成功后的提示进行配置
# node1 - node2
kubeadm join 192.168.108.128:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:7aa3604a266bdb23d52776d205ec8a69758ff75d949ed06bdbb116f84e410a26
# 端口号6443:通常用于Kubernetes集群的API接口,提供对集群的管理和控制

查看集群节点状态

bash 复制代码
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS     ROLES           AGE   VERSION
k8s-master   NotReady   control-plane   18m   v1.28.0
k8s-node01   NotReady   <none>          82s   v1.28.0
k8s-node02   NotReady   <none>          5s    v1.28.0

部署网络CNI组件

master节点

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主流的网络方案。

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

Github访问地址:https://github.com/projectcalico/calico

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

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

# 修改calico.yaml文件
[root@k8s-master ~]# vim calico.yaml
# 找到4601行,去掉注释并修改
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"		# 改为kubeadm-init.yaml中配置的podSubnet网段
  
# 部署calico
[root@k8s-master ~]# kubectl apply -f calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created

验证所有pod运行情况

bash 复制代码
[root@k8s-master ~]# kubectl get pods -A
NAMESPACE              NAME                                         READY   STATUS    RESTARTS       AGE
default                nginx-7854ff8877-9qpdg                       1/1     Running   0              100m
default                nginx-7854ff8877-bs9cl                       1/1     Running   0              100m
default                nginx-7854ff8877-l5hvz                       1/1     Running   0              99m
kube-system            calico-kube-controllers-658d97c59c-dnj7l     1/1     Running   1 (123m ago)   167m
kube-system            calico-node-lv99v                            1/1     Running   0              167m
kube-system            calico-node-lxdvn                            1/1     Running   0              167m
kube-system            calico-node-r4twq                            1/1     Running   1 (123m ago)   167m
kube-system            coredns-66f779496c-nzpjw                     1/1     Running   1 (123m ago)   175m
kube-system            coredns-66f779496c-wzrkp                     1/1     Running   1 (123m ago)   175m
kube-system            etcd-master                                  1/1     Running   2 (123m ago)   176m
kube-system            kube-apiserver-master                        1/1     Running   4 (121m ago)   176m
kube-system            kube-controller-manager-master               1/1     Running   2 (123m ago)   176m
kube-system            kube-proxy-qjz9p                             1/1     Running   1 (161m ago)   169m
kube-system            kube-proxy-stz98                             1/1     Running   2 (123m ago)   175m
kube-system            kube-proxy-tzsgh                             1/1     Running   1 (161m ago)   169m
kube-system            kube-scheduler-master                        1/1     Running   2 (123m ago)   176m
kube-system            metrics-server-57999c5cf7-qsw7p              1/1     Running   0              67m
kubernetes-dashboard   dashboard-metrics-scraper-5657497c4c-bgnbv   1/1     Running   0              51m
kubernetes-dashboard   kubernetes-dashboard-746fbfd67c-gwwxq        1/1     Running   0              51m

查看集群节点状态

bash 复制代码
[root@k8s-master ~]# kubectl get nodes

NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   32m   v1.28.0
k8s-node01   Ready    <none>          15m   v1.28.0
k8s-node02   Ready    <none>          14m   v1.28.0

优化操作

主节点安装kubectl命令补全

bash 复制代码
# 1.安装bash-completion工具
[root@k8s-master ~]# yum install bash-completion -y

# 2.执行bash_completion
[root@k8s-master ~]# source /usr/share/bash-completion/bash_completion

# 3.加载kubectl completion
# 在当前bash环境中临时设置命令补全
[root@k8s-master ~]# source <(kubectl completion bash)
# 在当前bash环境中永久设置命令补全
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source  ~/.bashrc
测试集群

创建应用服务nginx

bash 复制代码
# 创建应用服务nginx
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx --replicas=3		# 3副本
# 暴露服务端口
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

# 查看Pod和Service信息
# 默认情况下,master节点存在污点,不接受任何pod资源调度
[root@k8s-master ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7854ff8877-9qpdg   1/1     Running   0          109m
pod/nginx-7854ff8877-bs9cl   1/1     Running   0          109m
pod/nginx-7854ff8877-l5hvz   1/1     Running   0          108m

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        3h4m
service/nginx        NodePort    10.110.6.97   <none>        80:32700/TCP   108m

测试访问

浏览器输入地址:<node_IP:port> 查看nginx测试页面

比如本次实验node节点地址访问

http://192.168.108.129:32700

or

http://192.168.108.136:32700

k8s-1.28-cri-docker

环境部署

使用CentOS7-tpl准备三台节点,master和2台node节点

主机名 作用
k8s-master 管理节点
k8s-node01 工作节点
k8s-node02 工作节点
部署流程

以下操作有与containerd安装版有雷同操作,这里只展示需要改变的部分

升级内核

设置系统主机名和hosts文件

安装软件包

关闭防火墙和SELinux

关闭swap分区

调整系统内核参数

配置时间同步

配置IPVS功能

以上配置与 k8s-1.28-containerd 一致

以下是不同的地方

部署docker-ce环境

bash 复制代码
# 前置环境安装
[root@master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

yum-utils 提供了 yum-config-manager

device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2

Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理 的块设备驱动提供了一个高度模块化的内核架构

bash 复制代码
# 使用阿里云镜像(阿里云镜像如果抽风换其他镜像源也是一样的)
[root@master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

# 安装docker-ce
[root@master ~]# yum install -y docker-ce

# 启动docker服务
[root@master ~]# systemctl enable --now docker

# 镜像加速
[root@master ~]# vim /etc/docker/daemon.json
{
  "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"
        ]
}

修改Cgroup方式

bash 复制代码
[root@master ~]# vim /etc/docker/daemon.json
{
  "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"
        ],		`注意分割符号`
  "exec-opts": ["native.cgroupdriver=systemd"]		`添加cgroup方式`
}

cri-docker安装

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

对应版本:https://github.com/mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.e17.x86_64.rpm

bash 复制代码
# wget下载
[root@master ~]# wget https://github.com/mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.e17.x86_64.rpm

# 安装
[root@master ~]# rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm

# 编辑配置文件
[root@master ~]#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-docker服务
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start cri-docker.service
[root@master ~]# systemctl enable cri-docker.service

# 检查文件是否启动
[root@master ~]# ls /run/cri-*
/run/cri-dockerd.sock

kubernetes集群部署

添加k8s软件包源

安装kubeadm、kubectl、kubelet

修改kubelet的crgoup与containerd的crgoup保持一致

设置kubelet开机自启动

配置与 k8s-1.28-containerd 一致

在master节点操作

控制节点部署kubernetes

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

# 下载k8s集群所需要的镜像
# 这里有区别,需要加入一条选项命令 `--cri-socket=unix:///var/run/cri-dockerd.sock`
[root@k8s-master ~]# kubeadm config images pull --cri-socket=unix:///var/run/cri-dockerd.sock \
--kubernetes-version=v1.28.0 \
--image-repository=registry.aliyuncs.com/google_containers

# 查看k8s集群所有的镜像
[root@k8s-master ~]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED       SIZE
registry.aliyuncs.com/google_containers/kube-apiserver            v1.28.0   bb5e0dde9054   2 years ago   126MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.28.0   f6f496300a2a   2 years ago   60.1MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.28.0   4be79c38a4ba   2 years ago   122MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.28.0   ea1030da44aa   2 years ago   73.1MB
registry.aliyuncs.com/google_containers/etcd                      3.5.9-0   73deb9a3f702   2 years ago   294MB
registry.aliyuncs.com/google_containers/coredns                   v1.10.1   ead0a4a53df8   2 years ago   53.6MB
calico/kube-controllers                                           v3.25.0   5e785d005ccc   3 years ago   71.6MB
calico/cni                                                        v3.25.0   d70a5947d57e   3 years ago   198MB
calico/node                                                       v3.25.0   08616d26b8e7   3 years ago   245MB
registry.aliyuncs.com/google_containers/pause                     3.9       e6f181688397   3 years ago   744kB

初始化集群自动开启IPVS

初始化集群

配置kubectl工具

node节点

node工作节点加入集群

bash 复制代码
# 需要添加 --cri-socket unix:///var/run/cri-dockerd.sock,否则会报错
kubeadm join 192.168.108.128:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:7aa3604a266bdb23d52776d205ec8a69758ff75d949ed06bdbb116f84e410a26 \
--cri-socket unix:///var/run/cri-dockerd.sock

部署网络CNI组件

优化操作

测试集群

配置与 k8s-1.28-containerd 一致

相关推荐
信创天地2 小时前
自动化运维利器赋能信创:Ansible与SaltStack在国产系统的部署与批量管理实战
运维·自动化·ansible
东城绝神2 小时前
《Linux运维总结:基于ARM64+X86_64架构使用docker-compose一键离线部署MySQL8.0.43 NDB Cluster容器版集群》
linux·运维·mysql·架构·高可用·ndb cluster
creator_Li3 小时前
即时通讯项目--(1)环境搭建
linux·运维·ubuntu
魔芋红茶3 小时前
Spring Security 学习笔记 2:架构
笔记·学习·spring
Ka1Yan3 小时前
Docker:基本概念与快速入门
运维·docker·容器
Lips6114 小时前
2026.1.20力扣刷题笔记
笔记·算法·leetcode
文静小土豆4 小时前
Rocky Linux 二进制 安装K8S-1.35.0高可用集群
linux·运维·kubernetes
Hammer_Hans4 小时前
DFT笔记20
笔记
小技工丨4 小时前
华为TaiShan 200 2280 ARM服务器虚拟化部署完整指南
运维·服务器·arm开发