Kubernetes部署与运维04 Kubernetes集群创建

372 阅读17分钟

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部署与运维v3.png

整体规划

为方便后续内容学习,本部分将基于【Kubernetes部署与运维03 Kubernetes集群模板虚拟机部署】中模板虚拟机K8s_Template的环境开展Kubernetes的部署与学习。整体规划如下:

虚拟机名称IP地址主机名域名CPU核心内存角色
K8s_Template192.168.152.5k8sk8s.rz22GB模板
k8s_Master1_2G192.168.152.200master1master.rz22GBmaster
K8s_Worker1_2G192.168.152.201worker1worker1.rz12GBworker
K8s_Worker2_2G192.168.152.202worker2worker2.rz12GBworker

虽然worker1worker2分配内存1GB在控制平面初始化时不报错,但是在安装Metrics-Server插件时会报内存不足错误。因此,本部分最低内存要求设置为2GBCPU核心数除K8s_Master1_2G虚拟机之外,K8s_Worker1_2GK8s_Worker2_2G虚拟机均可以使用1核心或2核心,读者可根据自己电脑硬件配置灵活选择。

其中,各虚拟机的克隆关系如下:

源虚拟机克隆机
K8s_Nerdctl_BaseK8s_Template
K8s_TemplateK8s_Master1_2G
K8s_TemplateK8s_Worker1_2G
K8s_TemplateK8s_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包含一组独立的、可组合的控制过程,这些过程连续地将当前状态驱动到所提供的所需状态。如何从AC的方式无关紧要,也不需要集中控制,这使得系统更易于使用且功能更强大、系统更健壮、更为弹性和可扩展。

Kubernetes组件

Kubernetes集群由代表控制平面的组件和一组称为节点的机器组成。这些节点上运行着Kubernetes所管理的容器化应用。集群至少由一个主节点(Master)和一个工作节点(Worker)构成。

Pod是可以在Kubernetes中创建和管理的、最小的可部署的计算单元,其是一组(一个或多个)容器,这些容器共享存储、网络等资源。工作节点托管作为应用负载的Pod。控制平面(Control Plane)管理集群中的工作节点和Pod。为向集群提供故障转移和高可用性,这些控制平面一般跨多主机运行,集群跨多个节点运行。

下图展示了包含所有相互关联组件的Kubernetes集群: ![[Pasted image 20250210150905.png]]

控制平面组件

控制平面组件(Control Plane Components)对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的replicas字段时,启动新的Pod)。控制平面组件可以在集群中的任何节点上运行。然而,为了简单起见,配置脚本通常会在同一个计算机上启动所有控制平面组件,并且不会在此计算机上运行用户容器。控制平面核心组件如下:

  • kube-apiserver:该组件公开了Kubernetes APIAPI服务器是Kubernetes控制平面的前端。Kubernetes API服务器的主要实现是kube-apiserverkube-apiserver设计上考虑了水平伸缩,也即其可通过部署多个实例进行伸缩和平衡流量;
  • etcd:兼具一致性和高可用性的键值数据库,可作为保存Kubernetes所有集群数据的后台数据库;
  • kube-scheduler:负责监视新创建的、未指定运行节点(node)的Pods,并根据调度决策选择适合的节点让Pod在上面运行;
  • kube-controller-manager:在主节点上运行控制器管理器组件。从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。这些控制器包括: a)节点控制器(Node Controller):负责在节点出现故障时进行通知和响应; b)副本控制器(Replication Controller):负责为系统中的每个副本控制器对象维护正确数量的Pod; c)端点控制器(Endpoints Controller):填充端点(Endpoints)对象(即加入ServicePod); d)服务帐户和令牌控制器(Service Account & Token Controllers):为新的命名空间创建默认帐户和API访问令牌。
  • cloud-controller-manager:与kube-controller-manager类似,cloud-controller-manager将若干逻辑上独立的控制器组合到同一个可执行文件中,进而以同一进程的方式运行。云控制器管理器是指接入特定云提供商的控制逻辑的控制平面组件。如果仅在环境中运行Kubernetes,或者在本地计算机中运行学习环境,所部署的环境中不需要云控制器管理器。

控制平面可对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的replicas字段时,启动新的Pod)。控制平面组件由kube-apiserveretcdkube-schedulerkube-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支持多个容器运行时,包括DockercontainerdCRI-O以及任何实现Kubernetes CRI(容器运行时接口)规范的软件。

插件(扩展Addon)

插件(Addons)使用Kubernetes资源(DaemonSetDeployment等)实现集群功能。因为这些插件提供集群级别的功能,插件中命名空间域的资源属于kube-system命名空间。

有关可用插件的完整列表,请参见: https://kubernetes.io/zh/docs/concepts/cluster-administration/addons/

Kubernetes的生态与市场

容器化技术已经成为计算模型演化的一个开端,Kubernetes作为Google开源的Docker容器集群管理技术,在这块新的技术革命中扮演着重要的角色。Kubernetes正在被众多知名公司及企业采用,包括GoogleVMwareCoreOS、阿里云、腾讯、京东等。Kubernetes在全球内拥有超过两百家合作伙伴,具体可以参见CNCF Landscape

案例实践

前期准备

1)根据【整体规划】,从K8s_Template虚拟机克隆K8s_Master1_2GK8s_Worker1_2GK8s_Worker2_2G三台虚拟机。

2)参考【Kubernetes部署与运维01 Debian 12部署-静态IP配置】、【Kubernetes部署与运维01 Debian 12部署-主机名配置】,根据【整体规划】,配置K8s_Master1_2GK8s_Worker1_2GK8s_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命令,测试master1worker1worker2之间连通性:

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_2GK8s_Worker1_2GK8s_Worker2_2G三台虚拟机,部署控制平面。

1)在master1节点中配置kubeadmkubectl参数自动补全。可使用下列命令:

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地址,修改为主节点master1IP地址192.168.152.200
  • nodeRegistration.name:表示控制平面主节点名称,此处修改为master1
  • nodeRegistration.taints:表示控制平台主节点污点信息,此处增加- effect: NoSchedulekey: 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上进行了设置,但是对于工作节点worker1worker2上,由于两者均基于K8s_Template虚拟机克隆而来,因此工作节点worker1worker2中均未设置。

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 CIDRinit-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_2GK8s_Worker1_2GK8s_Worker2_2G三台虚拟机。

2)为K8s_Master1_2G虚拟机拍摄快照控制平面(仅Master1)创建完成,以备后续还原使用。

3)AI时代背景之下,运维将从传统CPU服务器切入到GPU服务器与端边设备,对于运维开发人员,技术玩家而言,也同步需要跟上新的技术栈。本学习内容涉及到的软件包、配置文件等资源,可以直接从百度网盘下载获取:

  • 百度网盘分享文件:Kubernetes1.32
  • 链接:https://pan.baidu.com/s/18XeGQ28BDPjHh8JKj0uZFQ?pwd=6x17 提取码:6x17