目录
- Kubernetes
- 前言
- 部署方式的演变
- K8S概述
- K8S架构
- Master节点
- 1. API Server
- 2. Etcd
- 3. Controller Manager
- 4. Scheduler
- Node节点
- 1. kubelet
- 2. kube-proxy
- 3. 容器运行时
- 组件与插件
- 1. Kubernetes DNS
- 2. Dashboard
- 3. Heapster
- 4. Ingress Controller
- K8S核心概念
- Pod
- Serivce
- Namespace
- Deployment
- StatefulSet
- DaemonSet
- Job
- CronJob
- ConfigMap
- Secret
- K8S安装和部署(Linux)
- 安装方式
- minikube方式安装
- 1. 查看Linux CPU架构
- 2. 安装crictl
- 3. 安装 cri-dockerd
- 4. 为无驱动程序安装容器网络插件
- 5.安装minikube
- 6. 启动minkube
- 7. 使用Dashboard
- Kubeadm方式安装
Kubernetes
前言
部署方式的演变
- 传统部署时代
各个组织是在物理服务器上运行应用程序,会造成多个应用在同一台物理机上互相影响,或者一台物理机只运行一个应用造成资源浪费,并且维护物理机的成本很高 - 虚拟化部署时代
虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。 - 容器部署时代
容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
K8S概述
官网
K8S是一个用于管理容器的开源平台。它可以让用户更加方便地部署、扩展和管理容器化应用程序,并通过自动化的方式实现负载均衡、服务发现和自动弹性伸缩等功能。
K8S架构
Master节点
1. API Server
API Server 是 Kubernetes 最核心的组件之一,它提供了 Kubernetes 集群中各个组件之间的通信和管理接口,所有操作都需要通过 API Server 发起和处理。当用户使用 kubectl 命令或者其他 Kubernetes 客户端工具时,实际上是通过 API Server 和集群进行交互的。
2. Etcd
Etcd 是 Kubernetes 集群中的分布式键值存储系统,用于保存集群中的所有状态信息和元数据。所有与 Kubernetes 集群相关的信息,包括 Pod、Service、Deployment 等对象的创建、更新和删除等操作,都将被记录在 Etcd 中。这样可以使得 Kubernetes 系统具有高可用性和复原能力,并且允许多个 Master 节点之间进行数据同步和共享。
3. Controller Manager
Controller Manager 是 Kubernetes 集群中的另一个核心组件,它负责监控和维护集群中所有资源对象的状态,以及进行自动化控制和管理操作。Controller Manager 中包含多个控制器,每个控制器负责监控和维护一种资源对象的状态,如 Deployment、ReplicaSet、DaemonSet 等,同时根据用户的需求,自动进行相应的容器调度、扩容、缩容等操作。
4. Scheduler
Scheduler 是 Kubernetes 集群中的另一个重要组件,主要负责根据集群中各个节点的负载情况,以及用户的调度策略,将新创建的 Pod 分配到合适的节点上。Scheduler 会根据 Pod 的资源需求、节点的资源情况、节点之间的网络距离等因素进行智能调度,从而实现负载均衡和资源最大化利用的目标。
Node节点
节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境。
1. kubelet
kubelet 是运行在每个 Node 节点上的代理程序,它负责与 Master 节点上的 API Server 进行通信,并根据 Master 节点下发的指令,调度和管理本地节点上的容器。kubelet 可以监控本地节点上的容器状态,如启动、停止、健康状况等,并定期向 Master 节点报告节点状态信息。
2. kube-proxy
kube-proxy 是 Kubernetes 集群中的网络代理组件,它主要负责实现集群内 Service 的负载均衡和访问控制等功能。每个 Node 节点上都会部署一个 kube-proxy 组件来负责处理该节点上所有 Service 的流量转发和路由等操作。
3. 容器运行时
容器运行时是 Kubernetes 中用于运行容器的底层组件,它负责将容器镜像转换为可以运行的进程,并提供容器的隔离、资源管理和网络管理等功能。Kubernetes 支持多种容器运行时,如 Docker、CRI-O、containerd 等,用户可以根据实际需求选择合适的容器运行时。容器运行时通常与 kubelet 紧密集成,在 Kubernetes 集群中发挥着至关重要的作用。
组件与插件
1. Kubernetes DNS
Kubernetes DNS 是 Kubernetes 集群中的域名解析系统,它为集群中所有容器提供了简单而可靠的 DNS 服务。通过 Kubernetes DNS,用户可以使用容器名称或 Service 名称等别名方式,轻松地访问到集群中运行的各种应用程序和服务。
2. Dashboard
Dashboard 是 Kubernetes 集群中的 Web 界面管理工具,它提供了一个易于使用和定制化的界面,让用户可以在不熟悉命令行操作的情况下,轻松地监控和管理集群中的资源对象和应用程序。Dashboard 支持多种自定义插件和主题,用户可以根据自己的需要进行定制和扩展。
3. Heapster
Heapster 是 Kubernetes 集群中的监控工具,它可以收集和分析各种容器和节点的性能指标,并将结果汇总和展示给用户。Heapster 支持多种存储后端,如 InfluxDB、ElasticSearch 等,用户可以选择适合自己的存储方式。
4. Ingress Controller
Ingress Controller 是 Kubernetes 集群中的负载均衡和流量路由组件,它可以将外部请求路由到集群内的不同 Service 或 Pod 上,并提供了多种负载均衡算法和路由规则。Ingress Controller 支持多种后端实现,如 Nginx、HAProxy 等,用户可以根据自己的需求进行选择和配置。 以上是 Kubernetes 中一些常用的组件和插件介绍,它们可以帮助用户更加高效地管理和操作 Kubernetes 集群中的容器应用程序。Kubernetes 的丰富生态系统和庞大社区,为用户提供了各种完善的支持和解决方案,让用户可以更加轻松地使用和掌握 Kubernetes。
K8S核心概念
Pod
Pod是Kubernetes的最小部署单元,通常包含一个或多个容器。Pod中的容器共享网络和存储,并在同一个主机上运行。
Serivce
Service 是 Kubernetes 中用于提供内部负载均衡和服务发现的组件,它可以将同一个应用程序的不同副本暴露在集群内部,并为这些副本提供唯一的虚拟 IP 地址和 DNS 域名。Service 可以通过控制器进行创建、更新和删除操作。
Service可以将多个Pod的IP地址和端口号作为一个服务提供给其他应用程序使用,这样即使Pod的IP地址和端口号发生变化,Service的IP地址和端口号也会保持不变,保证了服务的稳定性和可靠性。
在Kubernetes中,Service与Pods一起使用,可以通过标签来选择哪些Pods属于同一个Service。Service可以有不同的类型,包括ClusterIP、NodePort和LoadBalancer。其中,ClusterIP是默认类型,它将Service暴露在集群内部的虚拟IP地址上,只能从集群内部访问。NodePort类型将Service暴露在每个节点的IP地址和一个静态端口上,可以从集群外部访问。LoadBalancer类型使用云提供商的负载均衡器服务,将Service暴露在一个外部IP地址上,可以从公网访问。
Namespace
Namespace 是 Kubernetes 中用于隔离和管理资源对象的逻辑分区,它可以帮助用户将不同的资源对象归类、管理和隔离。Kubernetes 中默认存在一些 Namespace,如 default、kube-system 等,用户也可以根据需要创建自定义的 Namespace。
Deployment
Deployment 是 Kubernetes 中用于管理 Pod 副本集的控制器,它可以控制一组 Pod 的创建、扩缩容和更新等操作。Deployment 支持滚动更新和回滚等功能,可以实现无缝的应用程序版本升级。
StatefulSet
StatefulSet 是 Kubernetes 中用于管理有状态应用程序副本集的控制器,它可以为每个 Pod 分配唯一的标识符和稳定的网络名称,保证每个 Pod 的唯一性和可访问性。StatefulSet 还支持有序部署和扩缩容等功能,可以实现高可靠性的有状态应用程序部署和管理.
DaemonSet
DaemonSet 是 Kubernetes 中用于在每个节点上运行一组 Pod 的控制器,它通常用于运行系统级别的服务或代理程序等,在每个节点上保证资源对象的一致性和状态。
Job
Job 是 Kubernetes 中用于管理一次性任务的控制器,它会创建一个或多个 Pod 来执行某个任务,并在任务完成后自动删除这些 Pod。Job 还支持任务成功和失败的检测和处理等功能。
CronJob
CronJob 是 Kubernetes 中用于周期性执行任务的控制器,它可以根据用户定义的时间表,自动创建和删除相应的 Job 对象。CronJob 还支持任务成功和失败的检测和处理等功能。
ConfigMap
Kubernetes中的ConfigMap是一种用于存储应用程序配置数据的对象,它可以将配置数据与应用程序代码分离,从而提高了应用程序的可移植性和可维护性。ConfigMap可以存储任何形式的配置数据,例如环境变量、命令行参数、配置文件等等。
Secret
Kubernetes中的Secret是一种用于存储敏感信息的对象,例如密码、证书和密钥等
K8S安装和部署(Linux)
安装方式
- minikube:是一种在本地环境中部署Kubernetes的工具,它可以在单个虚拟机中运行一个Kubernetes集群,一般用于开发、测试环境搭建。
- kubeadm:是一种在物理机或虚拟机中快速部署Kubernetes集群的工具,已被证明可以应用于生成环境的集群搭建。
- 二进制包:手工安装,流程复杂。二进制是 k8s 早期部署方式,相比 Kubeadm 更易维护,容易排查问题。
minikube方式安装
1. 查看Linux CPU架构
uname -m
该命令将显示机器硬件名称。如果值为"x86_64",表示系统是x64架构;如果值为"armv7l"、"aarch64"或类似的ARM架构标识,表示系统是ARM架构。
2. 安装crictl
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOFsetenforce 0# 安装crictl工具
yum install -y cri-tools
# 生成配置文件
crictl config runtime-endpoint
# 编辑配置文件
cat << EOF | tee /etc/crictl.yaml
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 10
debug: false
pull-image-on-create: false
disable-pull-on-run: false
EOF# 查看是否安装成功,和docker命令差不多
crictl info
crictl images
3. 安装 cri-dockerd
cri-docked安装地址
- 安装go环境
使用 1.22的版本(尝试1.15报错)
# 下载Go语言二进制包
wget https://dl.google.com/go/go1.22.1.linux-amd64.tar.gz# 解压缩到/usr/local目录
sudo tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz
# 设置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
source ~/.profile# 验证安装
go version
- 安装cri-dockerd
下载cri-dockerd源码
git clone https://github.com/Mirantis/cri-dockerd.git进入cri-dockerd目录
cd cri-dockerd/make cri-dockerd //编译接下来执行cri-dockerd命令的安装及环境配置命令
install -o root -g root -m 0755 cri-dockerd /usr/bin/cri-dockerd
cp -a packaging/systemd/* /etc/systemd/systemsystemctl daemon-reload
systemctl enable cri-docker.service
systemctl enable --now cri-docker.socket
4. 为无驱动程序安装容器网络插件
CNI_PLUGIN_VERSION="<1.4.1>"
CNI_PLUGIN_TAR="cni-plugins-linux-amd64-$CNI_PLUGIN_VERSION.tgz" # change arch if not on amd64
CNI_PLUGIN_INSTALL_DIR="/opt/cni/bin"curl -LO "https://github.com/containernetworking/plugins/releases/download/$CNI_PLUGIN_VERSION/$CNI_PLUGIN_TAR"
sudo mkdir -p "$CNI_PLUGIN_INSTALL_DIR"
sudo tar -xf "$CNI_PLUGIN_TAR" -C "$CNI_PLUGIN_INSTALL_DIR"
rm "$CNI_PLUGIN_TAR"
5.安装minikube
minikube安装地址
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
minikube version
6. 启动minkube
(默认使用docker驱动)
minikube可以支持多种不同类型的驱动,这里我们使用docker。在命令行中输入以下命令启动minikube,其中–driver=docker指定了使用docker驱动,如果希望默认使用docker驱动,也可以执行命令minikube config set driver docker,–image-mirror-country和–image-repository是非必须的。
minikube start --image-mirror-country=cn
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
--driver=docker //在VM中执行需要把--drive=docker 换成--drive=none
根据报错提示需要安装conntrack:
这个错误信息表明你正在使用的Kubernetes版本1.28.3需要conntrack工具在root用户的PATH环境变量中才能运行。conntrack是一个用来跟踪网络连接的工具,它通常被用于管理iptables的NAT表,确保网络包的正确转发。
CentOS为例
sudo yum install conntrack-tools
如果你已经安装了conntrack但是Kubernetes仍然报错,可能是因为conntrack没有在root用户的PATH中。你可以尝试以root用户运行conntrack --version来确认。如果不在PATH中,你可以将其添加到root用户的.bashrc或.profile文件中
启动完成
7. 使用Dashboard
kubernetes为了方便集群的维护操作,提供了dashboard功能。dashboard包括了Cluster、Workloads、Service、Config and Storage、setting等多个模块功能,涵盖了kubernetes的方方面面,是个非常不错的管理GUI。
minikube dashboard
启动过程中如果提示添加metrics-server插件扩展,使用以下命令即可
minikube addons enable metrics-server
配置代理
kubectl proxy --port=8100 --address='192.168.2.107' --accept-hosts='^.*' &
Starting to serve on 192.168.2.107:8100
Kubeadm方式安装
敬请期待,还在抓紧创作中。