企业级Devops— 打造完整 CICD 实践指南(六):Kubernetes集群搭建

☁️ Kubernetes集群搭建与运维

🖥️机器B中安装

🚀 Kubernates简介

Kubernetes (简称K8s) 是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。它最初由Google开发,并在2014年捐赠给 Cloud Native Computing Foundation (CNCF),现在已经成为广泛使用的容器管理工具。

🌟 K8s的主要功能包括:

  • 容器调度和管理K8s允许用户定义和管理容器的部署,自动调度容器到合适的节点上,确保容器按照预定要求运行。

  • 自动化扩缩容K8s能够根据应用负载自动增加或减少容器实例,以实现高效的资源利用和负载均衡。

  • 负载均衡和服务发现K8s内建负载均衡功能,可以自动将流量分配到各个容器实例,确保应用的高可用性。它还提供了服务发现功能,使容器能够相互找到并通信。

  • 自愈能力K8s会监控容器的健康状态,若某个容器失败,自动替换并重新调度容器,确保应用的持续可用性。

  • 滚动更新与回滚K8s支持对容器应用进行无中断的滚动更新和回滚操作,确保应用更新时不会影响用户体验。

  • 配置管理和密钥管理K8s提供ConfigMapSecret用于管理应用的配置文件和敏感信息。

  • 跨云平台支持K8s支持在公有云、私有云以及本地数据中心进行部署,具有良好的可移植性。

  • 资源管理和监控K8s提供了丰富的资源管理工具,可以对CPU、内存等资源进行限制和分配,同时集成监控和日志管理,帮助管理员实时了解系统状态。

K8s通过其抽象层次使得应用部署和管理更加自动化,提升了容器化应用的可扩展性和灵活性,是目前云原生应用开发和部署的标准平台。

🏗️ Kubernetes架构

组件说明

  1. 控制平面(Control Plane) 🧠

控制平面是 Kubernetes 集群的"大脑",负责集群的决策和调度。它包含以下组件:

API Server (kube-apiserver):Kubernetes集群的入口点,所有的命令和请求都通过它与集群进行交互。API Server提供RESTful API,客户端(如kubectlk8s控制器、调度器等)通过它访问集群的状态和管理资源。

Controller Manager (kube-controller-manager):负责集群内的各种控制器,确保集群的实际状态与期望状态一致。例如,Pod控制器、ReplicaSet控制器、Deployment控制器等,负责Pod的调度、复制、状态同步等操作。

Scheduler (kube-scheduler):调度器负责将新创建的Pod分配到合适的节点上。它基于资源的可用性、负载等因素来做出调度决策。

etcdKubernetes的分布式键值存储,保存集群的所有配置数据、状态信息和元数据。etcdK8s的核心数据存储,用于存储集群的状态信息。

  1. 工作节点(Worker Node) 🛠️

每个工作节点上运行着容器化应用程序,负责处理实际的业务负载。工作节点包含以下组件:

Kubelet :每个工作节点上的代理,负责确保Pod的容器在节点上运行并健康。Kubelet通过与API Server通信,监控并报告容器的状态。

Kube Proxy :负责为工作节点上的服务提供网络代理,执行负载均衡功能。它允许容器通过虚拟IP访问服务,并在不同Pod之间分发请求。

容器运行时(Container Runtime :用于运行容器的环境。常见的容器运行时包括DockercontainerdCRI-O。容器运行时负责启动、停止和管理容器生命周期。

**Pod(s)**PodKubernetes中最小的部署单元,通常由一个或多个容器组成。Pod中的容器共享同一网络命名空间和存储卷,并运行在同一主机上。PodKubernetes调度和管理容器的基础单元。

  1. 组件之间的交互 🚀

API Server :所有的Kubernetes资源请求都会通过API Server。它负责处理HTTP请求,并与etcd存储交互来读取和修改集群状态。

Scheduler :在API Server中注册的Pod在没有指定节点的情况下,调度器会选择一个合适的节点来部署Pod

Controller Manager :通过监控Kubernetes的状态(如Pod副本数、Node状态等),自动修复集群中的不一致状态。

etcdetcd存储了整个集群的状态信息(包括PodNodeConfigMapSecret等),所有的配置更新都会写入etcd

KubeletKubelet负责通过Docker等容器运行时管理容器。它从API Server获取任务并确保容器按照规定运行。

Kube ProxyKube Proxy会为集群中的服务提供负载均衡,确保请求能够被路由到正确的Pod

总结

Kubernetes的架构是高度模块化的,包含了控制平面与工作节点的分离。控制平面负责集群的决策和资源调度,而工作节点负责实际的资源执行和容器管理。这种架构保证了Kubernetes的高可用性、灵活性和扩展性。

🔧 K8S安装

kind(Kubernetes IN Docker)是一个轻量级的工具,用于在本地Docker容器中创建和管理Kubernetes集群。它非常适合开发、测试和学习 Kubernetes,因为它能够快速在本地机器上搭建一个Kubernetes集群,而无需依赖虚拟机或云资源。

下面是使用kind搭建Kubernetes集群的步骤:

1. 🔧 Kind安装

执行下面命令安装kind:

bash 复制代码
# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.25.0/kind-linux-amd64

chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

其他系统请参考官网:quick start

查看是否安装成功✅

bash 复制代码
# kind version
kind v0.23.0 go1.21.10 linux/amd64

🌐 创建集群

⚠️ 注意 :如果您在远程主机上运行Kind,并且需要从与运行Kind的主机不同的主机向Kind节点IP发送流量,则需要配置端口映射。

  1. 集群配置文件conf.yaml
yaml 复制代码
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  apiServerAddress: "172.24.156.56"
  apiServerPort: 34689
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 30001
    hostPort: 30001
    protocol: TCP
  - containerPort: 30002
    hostPort: 30002
    protocol: TCP
  - containerPort: 30003
    hostPort: 30003
    protocol: TCP
  - containerPort: 30004
    hostPort: 30004
    protocol: TCP
  - containerPort: 30005
    hostPort: 30005
    protocol: TCP
  - containerPort: 30006
    hostPort: 30006
    protocol: TCP
  - containerPort: 30007
    hostPort: 30007
    protocol: TCP
  extraMounts:
    # This option mounts the host docker registry folder into
    # the control-plane node, allowing containerd to access them. 
    - containerPath: /etc/docker/certs.d/<your-domain>
      hostPath: /etc/docker/certs.d/<your-domain>
containerdConfigPatches:
  - |-
    [plugins."io.containerd.grpc.v1.cri".registry.configs."<your-domain>".tls]
      ca_file = "/etc/docker/certs.d/<your-domain>/<your-domain>_chain.crt"
      cert_file = "/etc/docker/certs.d/<your-domain>/<your-domain>.cert"
      key_file  = "/etc/docker/certs.d/<your-domain>/<your-domain>.key"

配置文件中几个重要参数:

  • apiServerAddress :我的机器是阿里云服务器,所以我这里填的是内网地址;作用是用来在jenkins中远程连接k8s集群
  • apiServerPort : 端口随意,⚠️ 注意不要冲突
  • extraPortMappings :预留暴露的端口,后面我们会通过Ingress访问服务
  • extraMounts : 挂载证书和私钥,kubectl拉取私有harbor中的镜像会用到
  • containerdConfigPatches :使用证书对harbor进行身份验证

⚠️ 注意 :目前涉及的证书都是阿里云创建的SSL证书;证书创建指定了域名,所以生成的证书文件名称前缀是:域名,后面会看到很多地方使用<your-domain>

  1. 🚀 创建集群

执行以下命令创建集群:

bash 复制代码
kind create cluster --config=./config.yaml
  1. 🖥️ 查看集群
bash 复制代码
kubectl cluster-info
  1. 📈 查看pod
bash 复制代码
kubectl get pods
  1. 📦 查看service
bash 复制代码
kubectl get service
  1. ⚙️ 查看deployment
bash 复制代码
kubectl get deployment
  1. 📡 查看node
bash 复制代码
kubectl get node
  1. 🗑️ 删除集群
bash 复制代码
kind delete cluster

⚙️ 配置Containerd代理

⚠️ 注意 :这一步不一定需要,具体看kubernetes版本。

查看k8s版本kubectl versionv1.30.4Kubernetes 1.12 版本开始,默认的容器运行时由 Docker 更换为 containerd。这就是明明docker可以下载镜像但k8s却下载不了镜像的原因。

编辑containerd配置文件

containerd配置文件路径/etc/containerd/conf.toml, 加入如下代码:

yaml 复制代码
[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = "/etc/containerd/certs.d"
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["dockerhub.azk8s.cn","https://mirrors.tuna.tsinghua.edu.cn"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
          endpoint = ["gcr.azk8s.cn/google_containers"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrirs."registry.k8s.io"]
          endpoint = ["gcr.azk8s.cn/google_containers"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."<harbor地址也就是域名,不带https>"]
          endpoint = ["https://<your-domain>"]
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."<harbor地址也就是域名,不带https>".tls]
          #insecure_skip_verify = true
          ca_file = "/etc/docker/certs.d/<your-domain>_chain.crt"
          cert_file = "/etc/docker/certs.d/<your-domain>.cert"
          key_file = "/etc/docker/certs.d/<your-domain>.key"
        [plugins."io.containerd.grpc.v1.cri".registry.configs."<your-domain>".auth]
          username = "admin"
          password = "123456"

配置代理

  • docker.io :添加代理["dockerhub.azk8s.cn","https://mirrors.tuna.tsinghua.edu.cn"]
  • k8s.gcr.io :添加代理:["gcr.azk8s.cn/google_containers"]

其中:

<harbor地址也就是域名,不带https>是前面搭建的Harbor私有仓库地址,并配置鉴权[plugins."io.containerd.grpc.v1.cri".registry.configs]部分。

💡 重启Containerd

执行以下命令重启Containerd,以使配置生效:

bash 复制代码
systemctl restart containerd

官网镜像配置(containerd/docs/cri/registry.md at main · containerd/containerd · GitHub)

insecure_skip_verify = true(Add insecure_skip_verify option. by Random-Liu · Pull Request #1345 · containerd/cri (github.com))

📝 备注

ctr images pull 可以通过 --skip-verify来跳过认证:

bash 复制代码
ctr images pull --skip-verify images:tag

💡 目前Proxy Server仅限于 Azure China IP 使用。

用法:

bash 复制代码
docker pull dockerhub.azk8s.cn/library/<imagename>:<version>

例如:

bash 复制代码
docker pull dockerhub.azk8s.cn/library/nginx
相关推荐
易样2 小时前
企业级Devops— 打造完整 CICD 实践指南(十一):Rancher可视化管理
自动化运维·devops
易样2 小时前
企业级Devops— 打造完整 CICD 实践指南(四):Gitlab代码仓库搭建
自动化运维·devops
易样2 小时前
企业级Devops— 打造完整 CICD 实践指南(三):Jenkins搭建
自动化运维·devops
易样2 小时前
企业级Devops— 打造完整 CICD 实践指南(一):手册核心内容亮点
devops
易样2 小时前
企业级DevOps——打造完整CICD实践指南(二):环境准备
自动化运维·devops
数聚天成DeepSData13 小时前
数聚天成 DeepSData 数据价值落地实战指南
java·maven·devops
热爱运维的小七1 天前
算力下沉时代,如何攻克“边缘”与“雾”计算的监控难题?
it运维·devops·服务器监控
薛少杰1 天前
什么是阿里云 CLI
自动化运维·命令行工具·插件化架构·阿里云cli·生态协作
龙智DevSecOps解决方案3 天前
ITSM选型指南 | Jira Service Management Standard vs Cloud Premium 版本对比与升级指导
atlassian·devops·aiops·jira·itsm·智能运维