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
- kubectl
- 把 YAML 发给 API Server
- API Server
- 校验请求
- 把期望状态写入 etcd
- Controller Manager
- 发现"需要 3 个 Pod"
- 创建 Pod 对象
- Scheduler
- 给 Pod 选择最合适的 Node
- kubelet(Node 上)
- 拉镜像
- 创建容器
- 启动 Pod
- 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内核模块功能说明:
- IPVS核心模块
- ip_vs :IPVS 负载均衡基础模块
- ip_vs_rr :轮询(Round Robin)调度算法
- ip_vs_wrr :加权轮询(Weighted RR)调度算法
- ip_vs_sh :源地址哈希(Source Hashing)调度算法
- 网络连接与过滤
- nf_conntrack_ipv4 :IPv4 连接跟踪(NAT/防火墙依赖,新内核中内核版本 ≥4.19 时合并至 nf_conntrack )
- ip_tables :iptables 基础框架
- ipt_REJECT :实现数据包拒绝(REJECT 动作)
- IP 集合管理
- ip_set :IP 地址集合管理
- xt_set & ipt_set :iptables 与 IP 集合的扩展匹配
- 网络隧道与桥接
- ipip :IP-over-IP 隧道协议
- overlay :Overlay 网络支持(如 Docker 跨主机网络)
- br_netfilter :桥接网络流量过滤(需配合 net.bridge.bridge-nf-call-iptables=1 参数)
- 反向路径过滤
- 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节点地址访问
or
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一致
