Kubernetes目前大约每年发布三次,由于迭代速度快,目前市场上绝大部分的教程相对陈旧。更重要的是,从Kubernetes 1.20开始,Kubernetes官方宣布逐步弃用Docker作为容器运行时,并计划在Kubernetes 1.24版本中完全移除对Docker作为容器运行时的支持。这意味着,从Kubernetes 1.24版本开始,将不能使用Docker作为容器运行时来运行Kubernetes节点上的Pods。因此,市场上关于直接使用containerd容器运行时的新版Kubernetes教程几乎没有,更重要的是因为的Kubernetes涉及到镜像需要单独配置才能获取,这无疑拉高了初学者门槛。本教程采用互联网的形式进行发布,便于保持与Kubernetes最新版的同步,尽量自包含,便于读者学习、实践。
关键字:Kubernetes 1.32; containerd; nerdctl; debain 12
整体规划
为方便后续内容学习,本部分将基于【Kubernetes部署与运维03 Kubernetes集群模板虚拟机部署】中模板虚拟机K8s_Template的环境开展Kubernetes的部署与学习。整体规划如下:
| 虚拟机名称 | IP地址 | 主机名 | 域名 | CPU核心 | 内存 | 角色 |
|---|---|---|---|---|---|---|
K8s_Template | 192.168.152.5 | k8s | k8s.rz | 2 | 2GB | 模板 |
k8s_Master1_2G | 192.168.152.200 | master1 | master.rz | 2 | 2GB | master |
K8s_Worker1_2G | 192.168.152.201 | worker1 | worker1.rz | 1 | 2GB | worker |
K8s_Worker2_2G | 192.168.152.202 | worker2 | worker2.rz | 1 | 2GB | worker |
虽然
worker1、worker2分配内存1GB在控制平面初始化时不报错,但是在安装Metrics-Server插件时会报内存不足错误。因此,本部分最低内存要求设置为2GB。CPU核心数除K8s_Master1_2G虚拟机之外,K8s_Worker1_2G与K8s_Worker2_2G虚拟机均可以使用1核心或2核心,读者可根据自己电脑硬件配置灵活选择。
其中,各虚拟机的克隆关系如下:
| 源虚拟机 | 克隆机 |
|---|---|
K8s_Nerdctl_Base | K8s_Template |
K8s_Template | K8s_Master1_2G |
K8s_Template | K8s_Worker1_2G |
K8s_Template | K8s_Worker2_2G |
参见【Kubernetes部署与运维02 Nerdctl Rootful部署】,Kubernetes基础环境各组件与版本信息如下:
- nerdctl: v1.7.7
- containerd: v1.7.22
- runc: v1.1.14
- CNI plugins: v1.5.1
- BuildKit: v0.15.2
- Stargz Snapshotter: v0.15.1
- imgcrypt: v1.1.11
- RootlessKit: v2.3.1
- slirp4netns: v1.3.1
- bypass4netns: v0.4.1
- fuse-overlayfs: v1.13
- containerd-fuse-overlayfs: v1.0.8
- Kubo (IPFS): v0.29.0
- Tini: v0.19.0
- buildg: v0.4.1
Kubernetes版本号为1.32。
理论知识
Kubernetes的概念与起源
单词Kubernetes源于希腊语,意为“舵手”或“飞行员”。Kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务。该项目起源于Google内部的容器编排系统Borg开源版,在2014年开始启动并获得开源。Kubernetes是建立在Google十几年的大规模运行生产工作负载经验基础之上,结合了社区中最好的想法和实践。Kubernetes由于单词较长,共10个字母。除首字母K与尾字母s之外,中间共含8个字母,因此,在很多文献中也被简写为K8s。
Kubernetes的功能
容器是打包和运行应用程序的最佳实践。在生产环境中,往往需要管理运行应用程序的容器,并确保其不会停服。如果一个容器发生故障,则需要启动另一个容器。如果系统可以统一处理此行为,运维工作将会更加高效。Kubernetes就是用于解决这些问题的方法。Kubernetes提供了一个可弹性运行分布式系统的框架,其可满足扩展要求、故障转移、部署模式等。Kubernetes主要提供了如下六方面的功能:
- 服务发现和负载均衡:
Kubernetes可使用DNS名称或IP地址公开容器,如果进入容器的流量很大,Kubernetes可以负载均衡并分配网络流量,从而使部署稳定; - 存储编排:
Kubernetes允许自动挂载所选择的存储系统,例如本地存储、公共云存储等; - 自动部署和回滚:可以使用
Kubernetes描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为期望状态。例如,可以自动化Kubernetes来部署新容器,删除现有容器并将它们的所有资源用于新容器; - 自动完成装箱计算:
Kubernetes允许指定每个容器所需的CPU和内存(RAM)资源。当容器指定了资源请求时,Kubernetes可做出更好的决策来管理容器的资源; - 自我修复:
Kubernetes可重新启动失败的容器、替换容器、杀死不响应用户定义运行状况检查的容器,并且在准备好服务之前不将其通告给客户端; - 密钥与配置管理:
Kubernetes可存储和管理敏感信息,例如密码、OAuth令牌和SSH密钥。可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
由于Kubernetes在容器级别而不是在硬件级别运行,它提供了PaaS产品共有的一些普遍适用的功能,例如部署、扩展、负载均衡、日志记录和监视。但是,Kubernetes不是单体系统,默认解决方案都是可选和可插拔的。Kubernetes提供了构建开发人员平台的基础,但是在重要的地方保留了用户的选择和灵活性:
- 不限制支持的应用程序类型。
Kubernetes旨在支持极其多种多样的工作负载,包括无状态、有状态和数据处理工作负载。如果应用程序可以在容器中运行,那么它应该可以在Kubernetes上很好地运行; - 不部署源代码,也不构建应用程序。持续集成(
CI)、交付和部署(CI/CD)工作流取决于组织的文化和偏好以及技术要求; - 不提供应用程序级别的服务作为内置服务。例如中间件(例如,消息中间件)、数据处理框架(例如,
Spark)、数据库(例如,MySQL)、缓存、集群存储系统(例如,Ceph)。这样的组件可以在Kubernetes上运行。并且/或者可以由运行在Kubernetes上的应用程序通过可移植机制(例如,开放服务代理)来访问; - 不要求日志记录、监视或警报解决方案。它提供了一些集成作为概念证明,并提供了收集和导出指标的机制;
- 不提供或不要求配置语言/系统(例如
jsonnet),它提供了声明性API,该声明性API可以由任意形式的声明性规范所构成; - 不提供也不采用任何全面的机器配置、维护、管理或自我修复系统。
此外,Kubernetes不仅仅是一个编排系统,实际上它消除了编排的需要。编排的技术定义是执行已定义的工作流程:首先执行A,然后执行B,再执行C。相比之下,Kubernetes包含一组独立的、可组合的控制过程,这些过程连续地将当前状态驱动到所提供的所需状态。如何从A到C的方式无关紧要,也不需要集中控制,这使得系统更易于使用且功能更强大、系统更健壮、更为弹性和可扩展。
Kubernetes组件
Kubernetes集群由代表控制平面的组件和一组称为节点的机器组成。这些节点上运行着Kubernetes所管理的容器化应用。集群至少由一个主节点(Master)和一个工作节点(Worker)构成。
Pod是可以在Kubernetes中创建和管理的、最小的可部署的计算单元,其是一组(一个或多个)容器,这些容器共享存储、网络等资源。工作节点托管作为应用负载的Pod。控制平面(Control Plane)管理集群中的工作节点和Pod。为向集群提供故障转移和高可用性,这些控制平面一般跨多主机运行,集群跨多个节点运行。
下图展示了包含所有相互关联组件的Kubernetes集群: ![[Pasted image 20250210150905.png]]
控制平面组件
控制平面组件(Control Plane Components)对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的replicas字段时,启动新的Pod)。控制平面组件可以在集群中的任何节点上运行。然而,为了简单起见,配置脚本通常会在同一个计算机上启动所有控制平面组件,并且不会在此计算机上运行用户容器。控制平面核心组件如下:
kube-apiserver:该组件公开了Kubernetes API。API服务器是Kubernetes控制平面的前端。Kubernetes API服务器的主要实现是kube-apiserver。kube-apiserver设计上考虑了水平伸缩,也即其可通过部署多个实例进行伸缩和平衡流量;etcd:兼具一致性和高可用性的键值数据库,可作为保存Kubernetes所有集群数据的后台数据库;kube-scheduler:负责监视新创建的、未指定运行节点(node)的Pods,并根据调度决策选择适合的节点让Pod在上面运行;kube-controller-manager:在主节点上运行控制器管理器组件。从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。这些控制器包括: a)节点控制器(Node Controller):负责在节点出现故障时进行通知和响应; b)副本控制器(Replication Controller):负责为系统中的每个副本控制器对象维护正确数量的Pod; c)端点控制器(Endpoints Controller):填充端点(Endpoints)对象(即加入Service与Pod); d)服务帐户和令牌控制器(Service Account & Token Controllers):为新的命名空间创建默认帐户和API访问令牌。cloud-controller-manager:与kube-controller-manager类似,cloud-controller-manager将若干逻辑上独立的控制器组合到同一个可执行文件中,进而以同一进程的方式运行。云控制器管理器是指接入特定云提供商的控制逻辑的控制平面组件。如果仅在环境中运行Kubernetes,或者在本地计算机中运行学习环境,所部署的环境中不需要云控制器管理器。
控制平面可对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的replicas字段时,启动新的Pod)。控制平面组件由kube-apiserver、etcd、kube-scheduler、kube-controller-manager等组件构成。为创建、部署控制平面,可以使用kubeadm工具。创建控制平面后,便拥有了一个可以进行资源调度的“集群”。
kubeadm是一个提供了kubeadm init命令和kubeadm join命令的工具,作为创建Kubernetes集群的“快捷途径”最佳实践。kubeadm通过执行必要的操作来启动和运行最小可用集群。按照设计,它只关注启动引导,而非配置机器。同样的,安装各种“锦上添花”的扩展,例如Kubernetes Dashboard监控方案,以及特定云平台的扩展,都属于kubeadm的管辖范围。
与集群进行交互,可以kubectl命令。kubectl命令行工具用于管理Kubernetes集群。kubectl在$HOME/.kube目录中查找一个名为config的配置文件。可以通过设置KUBECONFIG环境变量或设置--kubeconfig参数来指定其它kubeconfig文件。
Node组件
节点组件在每个节点上运行,维护运行的Pod并提供Kubernetes运行环境。
kubelet:一个在集群中每个节点(node)上运行的代理。它保证运行在Pod中的容器(containers)处于健康状态。kubelet不管理不是由Kubernetes创建的容器;kube-proxy:集群中每个节点上运行的网络代理,维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与Pod进行网络通信;- 容器运行时(
Container Runtime):容器运行时是负责运行容器的软件。Kubernetes支持多个容器运行时,包括Docker、containerd、CRI-O以及任何实现Kubernetes CRI(容器运行时接口)规范的软件。
插件(扩展Addon)
插件(Addons)使用Kubernetes资源(DaemonSet、Deployment等)实现集群功能。因为这些插件提供集群级别的功能,插件中命名空间域的资源属于kube-system命名空间。
有关可用插件的完整列表,请参见:
https://kubernetes.io/zh/docs/concepts/cluster-administration/addons/
Kubernetes的生态与市场
容器化技术已经成为计算模型演化的一个开端,Kubernetes作为Google开源的Docker容器集群管理技术,在这块新的技术革命中扮演着重要的角色。Kubernetes正在被众多知名公司及企业采用,包括Google、VMware、CoreOS、阿里云、腾讯、京东等。Kubernetes在全球内拥有超过两百家合作伙伴,具体可以参见CNCF Landscape
案例实践
前期准备
1)根据【整体规划】,从K8s_Template虚拟机克隆K8s_Master1_2G、K8s_Worker1_2G、K8s_Worker2_2G三台虚拟机。
2)参考【Kubernetes部署与运维01 Debian 12部署-静态IP配置】、【Kubernetes部署与运维01 Debian 12部署-主机名配置】,根据【整体规划】,配置K8s_Master1_2G、K8s_Worker1_2G、K8s_Worker2_2G三台虚拟机的静态IP地址与主机名。
三台虚拟机每台虚拟机的/etc/hosts文件内容如下:
127.0.0.1 localhost
192.168.152.200 master1
192.168.152.201 worker1
192.168.152.202 worker2
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
3)同时开启三台虚拟机,每台虚拟机均执行ping命令,测试master1、worker1与worker2之间连通性:
root@master1:~# ping master1
PING master1 (192.168.152.200) 56(84) bytes of data.
64 bytes from master1 (192.168.152.200): icmp_seq=1 ttl=64 time=0.158 ms
...
root@master1:~# ping worker1
PING worker1 (192.168.152.201) 56(84) bytes of data.
64 bytes from worker1 (192.168.152.201): icmp_seq=1 ttl=64 time=1.72 ms
...
root@master1:~# ping worker2
PING worker2 (192.168.152.202) 56(84) bytes of data.
64 bytes from worker2 (192.168.152.202): icmp_seq=1 ttl=64 time=0.514 ms
...
控制平面创建
【实践01-控制平面创建】
同时开启K8s_Master1_2G、K8s_Worker1_2G、K8s_Worker2_2G三台虚拟机,部署控制平面。
1)在master1节点中配置kubeadm与kubectl参数自动补全。可使用下列命令:
root@master1:~# kubeadm completion bash >/etc/bash_completion.d/kubeadm
root@master1:~# kubectl completion bash >/etc/bash_completion.d/kubectl
【选】对于非root用户(本教程基本上全部使用root账户开展运维工作,因此本步骤可忽略),则可编辑~/.bashrc文件,在文件末尾添加如下内容:
# kubeadm
source <(kubeadm completion bash)
# kubetcl
source <(kubectl completion bash)
【选】更新配置,使生效:
rz@master1:~# source .bashrc
2)控制平面创建需要提供配置文件,kubeadm提供了生成控制平面配置文件的参数。在主节点master1上的/root/software/k8s目录下生成集群控制平面配置文件init-defaults.yaml:
root@master1:~# cd /root/software/k8s/
root@master1:~/software/k8s# kubeadm config print init-defaults > init-defaults.yaml
root@master1:~/software/k8s# ll
total 8
-rw-r--r-- 1 root root 1108 Jan 29 11:06 init-defaults.yaml
-rw-r--r-- 1 root root 1200 Jan 28 08:21 kubernetes-apt-keyring.gpg
所生成的init-defaults.yaml文件内容如下:
───────┬─────────────────────────────────────────────────────────────────────────
│ File: init-defaults.yaml
───────┼─────────────────────────────────────────────────────────────────────────
1 │ apiVersion: kubeadm.k8s.io/v1beta4
2 │ bootstrapTokens:
3 │ - groups:
4 │ - system:bootstrappers:kubeadm:default-node-token
5 │ token: abcdef.0123456789abcdef
6 │ ttl: 24h0m0s
7 │ usages:
8 │ - signing
9 │ - authentication
10 │ kind: InitConfiguration
11 │ localAPIEndpoint:
12 │ advertiseAddress: 1.2.3.4
13 │ bindPort: 6443
14 │ nodeRegistration:
15 │ criSocket: unix:///var/run/containerd/containerd.sock
16 │ imagePullPolicy: IfNotPresent
17 │ imagePullSerial: true
18 │ name: node
19 │ taints: null
20 │ timeouts:
21 │ controlPlaneComponentHealthCheck: 4m0s
22 │ discovery: 5m0s
23 │ etcdAPICall: 2m0s
24 │ kubeletHealthCheck: 4m0s
25 │ kubernetesAPICall: 1m0s
26 │ tlsBootstrap: 5m0s
27 │ upgradeManifests: 5m0s
28 │ ---
29 │ apiServer: {}
30 │ apiVersion: kubeadm.k8s.io/v1beta4
31 │ caCertificateValidityPeriod: 87600h0m0s
32 │ certificateValidityPeriod: 8760h0m0s
33 │ certificatesDir: /etc/kubernetes/pki
34 │ clusterName: kubernetes
35 │ controllerManager: {}
36 │ dns: {}
37 │ encryptionAlgorithm: RSA-2048
38 │ etcd:
39 │ local:
40 │ dataDir: /var/lib/etcd
41 │ imageRepository: registry.k8s.io
42 │ kind: ClusterConfiguration
43 │ kubernetesVersion: 1.32.0
44 │ networking:
45 │ dnsDomain: cluster.local
46 │ serviceSubnet: 10.96.0.0/12
47 │ proxy: {}
48 │ scheduler: {}
───────┴─────────────────────────────────────────────────────────────────────────
(END)
3)编辑init-defaults.yaml文件,需要修改如下信息:
localAPIEndpoint.advertiseAddress:表示API Server地址,修改为主节点master1的IP地址192.168.152.200;nodeRegistration.name:表示控制平面主节点名称,此处修改为master1;nodeRegistration.taints:表示控制平台主节点污点信息,此处增加- effect: NoSchedule与key: node-role.kubernetes.io/master内容。【选,初学强烈不建议修改】clusterName:表示集群控制平面名称,此处设置为cluster-rz01。imageRepository:表示部署集群时使用的镜像仓库地址。需要将registry.k8s.io修改为国内可用镜像仓库,设置为registry.aliyuncs.com/google_containers。networking:表示网络相关配置,为了与后续安装的网络插件pod子网设置保持一致,明确地设置(增加)networking.podSubnet: 10.244.0.0/16。
修改之后,init-defaults.yaml文件内容如下:
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.152.200
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
imagePullSerial: true
name: master1
taints: null
timeouts:
controlPlaneComponentHealthCheck: 4m0s
discovery: 5m0s
etcdAPICall: 2m0s
kubeletHealthCheck: 4m0s
kubernetesAPICall: 1m0s
tlsBootstrap: 5m0s
upgradeManifests: 5m0s
---
apiServer: {}
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
certificatesDir: /etc/kubernetes/pki
clusterName: cluster-rz01
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.32.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
proxy: {}
scheduler: {}
4)在主节点master1上进行控制平面初始化,使用kubeadm init命令:
root@master1:~/software/k8s# kubeadm init --config init-defaults.yaml
[init] Using Kubernetes version: v1.32.0
[preflight] Running pre-flight checks
...
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
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:
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:
kubeadm join 192.168.152.200:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:f7b874117486c07656a808a1cb1c9afd4e217fe08c6c086b0d07f502cfe580c9
【选】(本教程基本上全部使用
root账户开展运维工作,因此本步骤可忽略)注意输出内容To start using your cluster, you need to run the following as a regular user。若是普通用户,可以执行以下操作:
mkdir -p $HOME/.kube:在家目录创建文件夹.kube;cp -i /etc/kubernetes/admin.conf $HOME/.kube/config:拷贝Kubernetes配置文件admin.conf为当前用户.kube/config文件;chown $(id -u):$(id -g) $HOME/.kube/config:修改.kube/config文件的所属用户与组为当前用户。
若是
root用户,则可以直接设置KUBECONFIG环境变量:export KUBECONFIG=/etc/kubernetes/admin.conf
5)当前用户为root用户,设置环境变量KUBECONFIG,修改/root/.bashrc文件,在文件尾部添加如下内容:
export KUBECONFIG=/etc/kubernetes/admin.conf
6)加载环境变量KUBECONFIG:
root@master1:~/software/k8s# source /root/.bashrc
7)初始化完成之后,可以使用kubectl get nodes命令查看当前控制平面中节点的数量及简要信息:
root@master1:~/software/k8s# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 NotReady control-plane 6m44s v1.32.1
root@master1:~/software/k8s# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
coredns-6766b7b6bb-hqgsd 0/1 Pending 0 6m49s
coredns-6766b7b6bb-w8ztk 0/1 Pending 0 6m49s
etcd-master1 1/1 Running 0 6m55s
kube-apiserver-master1 1/1 Running 0 6m55s
kube-controller-manager-master1 1/1 Running 0 6m55s
kube-proxy-h2v5l 1/1 Running 0 6m50s
kube-scheduler-master1 1/1 Running 0 6m55s
8)查看Kubernetes控制平面所涉及到的镜像:
root@master1:~/software/k8s# kubeadm config images list
registry.k8s.io/kube-apiserver:v1.32.1
registry.k8s.io/kube-controller-manager:v1.32.1
registry.k8s.io/kube-scheduler:v1.32.1
registry.k8s.io/kube-proxy:v1.32.1
registry.k8s.io/coredns/coredns:v1.11.3
registry.k8s.io/pause:3.10
registry.k8s.io/etcd:3.5.16-0
9)由于使用了国内镜像仓库源,实际拉取到本地的镜像为:
root@master1:~/software/k8s# crictl image list
IMAGE TAG IMAGE ID SIZE
.../coredns v1.11.3 c69fa2e9cbf5f 18.6MB
.../etcd 3.5.16-0 a9e7e6b294baf 57.7MB
.../kube-apiserver v1.32.0 c2e17b8d0f4a3 28.7MB
.../kube-controller-manager v1.32.0 8cab3d2a8bd0f 26.3MB
.../kube-proxy v1.32.0 040f9f8aac8cd 30.9MB
.../kube-scheduler v1.32.0 a389e107f4ff1 20.7MB
.../pause 3.10 873ed75102791 320kB
由于排版限制,略去部分内容。
10)Kubernetes中,默认使用的是k8s.io命名空间(namespace),而nerdctl默认使用的是default命名空间(namespace)。因此,若希望使用nerdctl查看Kubernetes中的镜像,需要增加-n参数指定k8s.io命名空间:
root@master1:~/software/k8s# nerdctl -n=k8s.io images
REPOSITORY TAG IMAGE ID SIZE
.../coredns v1.11.3 6662e5928ea0 63.4 MiB
.../coredns <none> 6662e5928ea0 63.4 MiB
.../etcd 3.5.16-0 ab4940cffc3e 146.2 MiB
.../etcd <none> ab4940cffc3e 146.2 MiB
.../kube-apiserver v1.32.0 c42cc910ccb5 95.6 MiB
.../kube-apiserver <none> c42cc910ccb5 95.6 MiB
.../kube-controller-manager v1.32.0 b1346feb9478 88.7 MiB
.../kube-controller-manager <none> b1346feb9478 88.7 MiB
.../kube-proxy v1.32.0 3c780c2ff377 93.3 MiB
.../kube-proxy <none> 3c780c2ff377 93.3 MiB
.../kube-scheduler v1.32.0 74e9a8f45c5e 69.5 MiB
.../kube-scheduler <none> 74e9a8f45c5e 69.5 MiB
.../pause 3.10 0ca1162b75bf 724.0 KiB
.../pause <none> 0ca1162b75bf 724.0 KiB
<none> <none> 3c780c2ff377 93.3 MiB
<none> <none> 0ca1162b75bf 724.0 KiB
<none> <none> b1346feb9478 88.7 MiB
<none> <none> 74e9a8f45c5e 69.5 MiB
<none> <none> ab4940cffc3e 146.2 MiB
<none> <none> c42cc910ccb5 95.6 MiB
<none> <none> 6662e5928ea0 63.4 MiB
可以创建/etc/nerdctl目录,然后添加nerdctl配置文件/etc/nerdctl/nerdctl.toml,使默认命名空间为k8s.io,内容如下:
namespace = "k8s.io"
该设置仅在主节点
master1上进行了设置,但是对于工作节点worker1与worker2上,由于两者均基于K8s_Template虚拟机克隆而来,因此工作节点worker1与worker2中均未设置。
Calico网络插件部署
【实践02-Calico网络插件部署】
Kubernetes集群控制平面创建之后,需要部署网络插件,本实践将部署Calico网络插件。
1)创建/root/software/calico3.29/目录,在其中保存对应的相关配置文件。
root@master1:~/software/k8s# cd
root@master1:~# mkdir /root/software/calico.3.29
root@master1:~# cd /root/software/calico.3.29/
2)下载使用Kubernetes API datastore的资源清单:
root@master1:~/software/calico.3.29# wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.1/manifests/calico.yaml
--2025-01-29 17:38:26-- https://raw.githubusercontent.com/projectcalico/calico/v3.29.1/manifests/calico.yaml
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 323422 (316K) [text/plain]
Saving to: ‘calico.yaml’
calico.yaml 100%[===================>] 315.84K 1.52MB/s in 0.2s
2025-01-29 17:38:27 (1.52 MB/s) - ‘calico.yaml’ saved [323422/323422]
root@master1:~/software/calico.3.29# ll
total 316
-rw-r--r-- 1 root root 323422 Jan 29 17:38 calico.yaml
root@master1:~/software/calico.3.29# cp calico.yaml calico.yaml.bak
cp calico.yaml calico.yaml.bak命令为备份calico.yaml。
若无法下载,请查看本教程最后的百度网盘下载链接,其中提供了本教程所涉及到的相关文件与资源。
3)修改calico.yaml文件,取消注释CALICO_IPV4POOL_CIDR,修改Pod CIDR与init-defaults.yaml配置中的设置一致:
6278 │ - name: CALICO_IPV4POOL_CIDR
6279 │ value: "10.244.0.0/16"
在
vim编辑器中,在正常模式下可以直接输入:6278回车,直接跳转至第6278行。
4)使用kubectl apply安装Calico网络插件:
root@master1:~/software/calico.3.29# kubectl apply -f calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
serviceaccount/calico-cni-plugin created
...
clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created
root@master1:~/software/calico.3.29# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 129m v1.32.1
root@master1:~/software/calico.3.29# kubectl -n kube-system get pods
NAME READY STATUS AGE
calico-kube-controllers-5745477d4d-x4dbj 0/1 ContainerCreating 67s
calico-node-d9sv5 0/1 Init:2/3 67s
coredns-6766b7b6bb-hqgsd 0/1 ContainerCreating 129m
coredns-6766b7b6bb-w8ztk 0/1 ContainerCreating 129m
etcd-master1 1/1 Running 129m
kube-apiserver-master1 1/1 Running 129m
kube-controller-manager-master1 1/1 Running 129m
kube-proxy-h2v5l 1/1 Running 129m
kube-scheduler-master1 1/1 Running 129m
root@master1:~/software/calico.3.29# kubectl -n kube-system get pods
NAME READY STATUS AGE
calico-kube-controllers-5745477d4d-x4dbj 1/1 Running 2m22s
calico-node-d9sv5 1/1 Running 2m22s
coredns-6766b7b6bb-hqgsd 1/1 Running 130m
coredns-6766b7b6bb-w8ztk 1/1 Running 130m
etcd-master1 1/1 Running 130m
kube-apiserver-master1 1/1 Running 130m
kube-controller-manager-master1 1/1 Running 130m
kube-proxy-h2v5l 1/1 Running 130m
kube-scheduler-master1 1/1 Running 130m
现在,所有的核心组件均处于
1/1状态了,集群控制平面创建完成(仅包含一个节点master1)。
收尾工作
1)使用poweroff关闭K8s_Master1_2G、K8s_Worker1_2G、K8s_Worker2_2G三台虚拟机。
2)为K8s_Master1_2G虚拟机拍摄快照控制平面(仅Master1)创建完成,以备后续还原使用。
3)AI时代背景之下,运维将从传统CPU服务器切入到GPU服务器与端边设备,对于运维开发人员,技术玩家而言,也同步需要跟上新的技术栈。本学习内容涉及到的软件包、配置文件等资源,可以直接从百度网盘下载获取:
- 百度网盘分享文件:
Kubernetes1.32 - 链接:
https://pan.baidu.com/s/18XeGQ28BDPjHh8JKj0uZFQ?pwd=6x17提取码:6x17