☁️ Kubernetes集群搭建与运维
🖥️机器B中安装
🚀 Kubernates简介
Kubernetes (简称K8s) 是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。它最初由Google开发,并在2014年捐赠给 Cloud Native Computing Foundation (CNCF),现在已经成为广泛使用的容器管理工具。
🌟 K8s的主要功能包括:
-
容器调度和管理 :
K8s允许用户定义和管理容器的部署,自动调度容器到合适的节点上,确保容器按照预定要求运行。 -
自动化扩缩容 :
K8s能够根据应用负载自动增加或减少容器实例,以实现高效的资源利用和负载均衡。 -
负载均衡和服务发现 :
K8s内建负载均衡功能,可以自动将流量分配到各个容器实例,确保应用的高可用性。它还提供了服务发现功能,使容器能够相互找到并通信。 -
自愈能力 :
K8s会监控容器的健康状态,若某个容器失败,自动替换并重新调度容器,确保应用的持续可用性。 -
滚动更新与回滚 :
K8s支持对容器应用进行无中断的滚动更新和回滚操作,确保应用更新时不会影响用户体验。 -
配置管理和密钥管理 :
K8s提供ConfigMap和Secret用于管理应用的配置文件和敏感信息。 -
跨云平台支持 :
K8s支持在公有云、私有云以及本地数据中心进行部署,具有良好的可移植性。 -
资源管理和监控 :
K8s提供了丰富的资源管理工具,可以对CPU、内存等资源进行限制和分配,同时集成监控和日志管理,帮助管理员实时了解系统状态。
K8s通过其抽象层次使得应用部署和管理更加自动化,提升了容器化应用的可扩展性和灵活性,是目前云原生应用开发和部署的标准平台。
🏗️ Kubernetes架构

组件说明
- 控制平面(
Control Plane) 🧠
控制平面是 Kubernetes 集群的"大脑",负责集群的决策和调度。它包含以下组件:
API Server (kube-apiserver):Kubernetes集群的入口点,所有的命令和请求都通过它与集群进行交互。API Server提供RESTful API,客户端(如kubectl、k8s控制器、调度器等)通过它访问集群的状态和管理资源。
Controller Manager (kube-controller-manager):负责集群内的各种控制器,确保集群的实际状态与期望状态一致。例如,Pod控制器、ReplicaSet控制器、Deployment控制器等,负责Pod的调度、复制、状态同步等操作。
Scheduler (kube-scheduler):调度器负责将新创建的Pod分配到合适的节点上。它基于资源的可用性、负载等因素来做出调度决策。
etcd :Kubernetes的分布式键值存储,保存集群的所有配置数据、状态信息和元数据。etcd是K8s的核心数据存储,用于存储集群的状态信息。
- 工作节点(
Worker Node) 🛠️
每个工作节点上运行着容器化应用程序,负责处理实际的业务负载。工作节点包含以下组件:
Kubelet :每个工作节点上的代理,负责确保Pod的容器在节点上运行并健康。Kubelet通过与API Server通信,监控并报告容器的状态。
Kube Proxy :负责为工作节点上的服务提供网络代理,执行负载均衡功能。它允许容器通过虚拟IP访问服务,并在不同Pod之间分发请求。
容器运行时(Container Runtime) :用于运行容器的环境。常见的容器运行时包括Docker、containerd和CRI-O。容器运行时负责启动、停止和管理容器生命周期。
**Pod(s)**:Pod 是Kubernetes中最小的部署单元,通常由一个或多个容器组成。Pod中的容器共享同一网络命名空间和存储卷,并运行在同一主机上。Pod是Kubernetes调度和管理容器的基础单元。
- 组件之间的交互 🚀
API Server :所有的Kubernetes资源请求都会通过API Server。它负责处理HTTP请求,并与etcd存储交互来读取和修改集群状态。
Scheduler :在API Server中注册的Pod在没有指定节点的情况下,调度器会选择一个合适的节点来部署Pod。
Controller Manager :通过监控Kubernetes的状态(如Pod副本数、Node状态等),自动修复集群中的不一致状态。
etcd :etcd存储了整个集群的状态信息(包括Pod、Node、ConfigMap、Secret等),所有的配置更新都会写入etcd。
Kubelet :Kubelet负责通过Docker等容器运行时管理容器。它从API Server获取任务并确保容器按照规定运行。
Kube Proxy :Kube 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发送流量,则需要配置端口映射。
- 集群配置文件
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>
- 🚀 创建集群
执行以下命令创建集群:
bash
kind create cluster --config=./config.yaml
- 🖥️ 查看集群
bash
kubectl cluster-info
- 📈 查看
pod
bash
kubectl get pods
- 📦 查看
service
bash
kubectl get service
- ⚙️ 查看
deployment
bash
kubectl get deployment
- 📡 查看
node
bash
kubectl get node
- 🗑️ 删除集群
bash
kind delete cluster
⚙️ 配置Containerd代理
⚠️ 注意 :这一步不一定需要,具体看
kubernetes版本。
查看k8s版本kubectl version为v1.30.4 而Kubernetes 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