kubernetes集群部署


kubernetes简单入门

1.kubernetes是什么?

Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。

Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。

2.kubernetes组件

2.1.控制平面组件(Control Plane Components)

2.1.1.kube-apiserver

API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。

Kubernetes API 服务器的主要实现是 kube-apiserverkube-apiserver 设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。

2.1.2.kube-scheduler

kube-scheduler控制平面的组件, 负责监视新创建的、未指定运行节点(node)Pods, 并选择节点来让 Pod 在上面运行。

调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。

2.1.3.kube-controller-manager

kube-controller-manager控制平面的组件, 负责运行控制器进程。

从逻辑上讲, 每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。

这些控制器包括:

  • 节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
  • 任务控制器(Job Controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
  • 端点控制器(Endpoints Controller):填充端点(Endpoints)对象(即加入 Service 与 Pod)
  • 服务帐户和令牌控制器(Service Account & Token Controllers):为新的命名空间创建默认帐户和 API 访问令牌
2.1.4.cloud-controller-manager

cloud-controller-manager 是指嵌入特定云的控制逻辑之 控制平面组件。 cloud-controller-manager 允许你将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。

cloud-controller-manager 仅运行特定于云平台的控制器。 因此如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的集群不需要有云控制器管理器。

kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的控制回路组合到同一个可执行文件中, 供你以同一进程的方式运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。

下面的控制器都包含对云平台驱动的依赖:

  • 节点控制器(Node Controller):用于在节点终止响应后检查云提供商以确定节点是否已被删除
  • 路由控制器(Route Controller):用于在底层云基础架构中设置路由
  • 服务控制器(Service Controller):用于创建、更新和删除云提供商负载均衡器
2.1.5.etcd

etcd 是兼顾一致性与高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。

你的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。

如果想要更深入的了解 etcd,请参考 etcd 文档

2.2.Node 组件

2.2.1.kubelet

kubelet 会在集群中每个节点(node)上运行。 它保证容器(containers)都运行在 Pod 中。

kubelet 接收一组通过各类机制提供给它的 PodSpecs, 确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。

2.2.2.kube-proxy

kube-proxy 是集群中每个节点(node)所上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。

kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。

如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。

2.2.3.Flannel(Kubernetes网络组件)

Flannel是Kubernetes中一种常用的网络插件,用于为集群中的Pod提供网络互联。它使用了一种名为VXLAN(Virtual Extensible LAN)的技术来创建覆盖整个Kubernetes集群的虚拟网络。

具体来说,Flannel使用以下方式工作:

1.初始化:当Flannel代理节点启动时,它会为每个节点分配一个唯一的、未使用的子网(CIDR)地址段,通过etcd存储这些地址段信息,并将其称为“网络配置”。

2.分配IP地址:当需要为一个新的Pod分配IP地址时,Flannel会从网络配置中选择一个可用的子网,然后在该子网中为该Pod分配一个IP地址。Flannel会确保所选子网中的任何其他Pod都不会使用相同的IP地址。

3.创建网络隧道:为了将不同节点上的Pod连接起来,Flannel会创建一组网络隧道。具体来说,它会在每个节点上创建一个虚拟网络接口vxlan0,并将其绑定到一个物理网络接口(如eth0)。然后,Flannel会使用VXLAN技术,在不同节点之间创建一个覆盖整个Kubernetes集群的虚拟网络。
4.数据传输:当两个Pod需要进行通信时,它们会像单个计算机内部的进程一样通信。数据包被发送到本地的虚拟网络接口vxlan0,并通过创建的隧道传输到目标节点上的vxlan0接口。然后,数据包被路由到目标Pod。

3.kubernetes的资源对象

  • 1.ReplicationController
  • 2.ReplicationSet
  • 3.Deployment
  • 4.Ingress
  • 5.Secret
1.ReplicationController

Replication Controller(RC)是一种核心资源对象,用于确保指定数量的Pod副本正在运行。它允许用户定义一个Pod模板,并创建多个相同的Pod副本,以便在集群中部署和管理应用程序容器。

具体来说,Replication Controller 可以确保满足以下条件:
1.运行指定数量的 Pod 副本:用户可以通过 RC 对象指定需要创建和维护的Pod副本数。

2.重启崩溃的 Pod:当某个 Pod 崩溃或被删除时,RC会自动创建一个新的 Pod 副本来代替它。

3.控制 Pod 的生命周期:用户可以使用 RC 来进行滚动更新、扩容/缩容等操作,而无需手动管理每个 Pod 的状态。
Replication Controller已经不被推荐使用,而是使用ReplicationSet或者Deployment进行代替

2.ReplicationSet

ReplicaSet(RS)是一种资源对象,用于确保指定数量的 Pod 副本正在运行。类似于 Replication Controller(RC),但 RS 具有更多高级的功能。

1.与 RC 不同的是,RS 可以使用 Label Selector 来选择要管理的 Pod 子集,从而允许用户根据其需要更精细地控制 Pod 的创建和删除。例如,用户可以定义一个 Label Selector 来选择特定类型的 Pod,并在满足一些特定条件时自动扩展或缩小该 Pod 集合。

2.此外,RS 还支持滚动升级,即在更新 Pod 模板时逐步替换现有 Pod 副本,以实现应用程序的无缝升级,这在 RC 中是不支持的。

3.总之,ReplicaSet 是 Kubernetes 中一种关键的资源对象,用于管理 Pod 的副本集。它提供了比 RC 更高级的功能,如 Label Selector、滚动升级等,使得管理和部署应用程序变得更加灵活和可靠。

3.Deployment

1.Deployment 是一种资源对象,用于管理 Pod 副本集的创建、更新和删除等操作。Deployment 通常建立在 ReplicaSet(RS)之上,并通过动态地创建、更新和删除 RS 对象来实现应用程序的无缝升级和回滚。

2.Deployment 允许用户指定一个 Pod 模板,并定义需要创建和维护的 Pod 副本数。然后,当需要更新应用程序时,用户可以修改 Pod 模板,并通过 Deployment 对象进行滚动升级,以逐步替换现有 Pod 副本。如果更新失败或出现问题,Deployment 还支持回滚操作,以自动恢复到先前的稳定状态。

3.此外,Deployment 还支持暂停/恢复操作,允许用户在更新过程中暂停所有 Pod 的创建和删除,以便进行一些必要的检查和修复。

4.Service

具体来说,Service 可以帮助用户实现以下功能:

1.发现和路由:通过 Service 对象,用户可以为一组 Pod 创建一个稳定的 IP 和端口,并使用该 IP 和端口将请求路由到集群中的任何一个 Pod 上。

2.负载均衡:当多个 Pod 共享同一个 Service 时,Kubernetes 会自动为这些 Pod 进行负载均衡,从而分摊请求流量并提高系统的可靠性和性能。

3.健康检查:Service 还支持对后端 Pod 的健康状态进行检查,并在发现故障时自动调整路由策略,从而保证应用程序的可用性和稳定性。

5.Secret

Secret 是一种资源对象,用于存储敏感数据,例如密码、API 密钥、证书等。它提供了一种安全地将这些敏感数据传递给容器的方法,同时也可以确保这些数据在传输和存储过程中得到加密和保护。

具体来说,Secret 可以用于以下场景:

1.存储密码和机密数据:例如数据库密码、SSH 密钥等。

2.存储 TLS 证书:例如 HTTPS 网站所需的证书和私钥。

3.存储 API 认证密钥:例如 OAuth 鉴权所需的令牌信息等。

在使用 Secret 时,用户需要先创建一个 Secret 对象,并将需要存储的数据放到其中。然后,可以通过 Pod 的环境变量、卷挂载等方式,将这些数据传递给容器。Kubernetes 会自动将 Secret 数据转换为 Base64 编码格式,并在传输和存储过程中对其进行加密和保护。

6.Ingress

Ingress 是一种资源对象,用于管理对集群中 Service 的 HTTP/HTTPS 访问,并允许用户使用类似于 Nginx 的路由规则将流量路由到不同的服务或后端 Pod 上。

具体来说,Ingress 可以实现以下功能:

1.路由:使用 Ingress 规则,将入站请求路由到指定的 Service 或后端 Pod 上。

2.HTTPS 支持:通过定义 TLS 证书和私钥,Ingress 可以实现终止和解密传入的 HTTPS 连接,并在转发请求时重新加密。

3.负载均衡:当多个 Pod 共享同一个 Ingress 时,Kubernetes 会自动为这些 Pod 进行负载均衡,从而分摊请求流量并提高系统的可靠性和性能。

4.应用程序层通信:可以使用 Ingress 控制器实现应用程序层的通信,例如 WebSocket、HTTP/2 等。

注意,Ingress本身并不提供负载均衡功能,只是简单的将各个匹配规则的流量转发到各个Service,虽然Ingress会有负载均衡算法,但是这些负载均衡算法是告诉Service的,实际的负载均衡是Service来做的

4.kubernetes集群部署

本教程基于Archlinux,其他发行版大体步骤类似
容器引擎基于CRI-O

1.安装必要的组件

1
2
3
4
pacman -S kubeadm kubelet kubectl containerd 
#kubeadm用于管理kubernetes的工具
#kubectl用于控制kubernetes集群的工具
#cri-o 一种专门为kubernetes设计的容器引擎

2.准备好必要的组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#加载内核模块
modprobe br_netfilter
modprobe overlay

cat > /lib/modules-load.d/10-kubernetes.conf <<EOF
br_netfilter
overlay
ip_vs
ip_vs_wr
ip_vs_wrr
EOF

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sysctl -p

2.启动容器引擎

1
sudo systemctl start crio

3.初始化集群

1
2
3
4
5
sudo kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.254.0.0/16 --service-cidr=10.253.0.0/16 --cri-socket=unix:///var/run/containerd/containerd.sock
#指定国内的镜像仓库,不然可能会拉取镜像失败
#--pod-network-cidr指定pod网段
#--service-cidr指定svc网段
#--cri-socket指定容器引擎的socket

4.创建集群成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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.1.250:6443 --token 6xfvp5.9gdoo9c9xp87cn4c \
--discovery-token-ca-cert-hash sha256:cd43db87da74dbcb3fb4eedf4bfdb454a175431928f8accbac331a357797e104

5.安装网络插件

参考
https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/#networking-and-network-policy

1
2
3
4
5

wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
#修改文件中的网段修改成自己创建集群时候的pod网段
#创建启动 flannel pod
kubectl apply -f ./kube-flannel.yml

常见问题

1.apiserver以及etcd重启问题

对于systemd启动的linux系统,我们需要将容器引擎的资源分配策略改为systemd
containerd

1
2
3
4
5
6
7
8
9
10
11
12
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
BinaryName = ""
CriuImagePath = ""
CriuPath = ""
CriuWorkPath = ""
IoGid = 0
IoUid = 0
NoNewKeyring = false
NoPivotRoot = false
Root = ""
ShimCgroup = ""
SystemdCgroup = true

2.网络问题

对于crio容器引擎可能需要指定网络插件配置文件的目录

1
vim /etc/crio/crio.conf
1
2
3
4
5
6
7
[crio.network]
plugin_dirs = [
"/opt/cni/bin",
]
#在修改这个配置文件前确认这个文件下有没有配置文件
#重启crio和kubelet
systemctl restart crio kubelet

文章作者: 404NotFound
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 404NotFound !
评论
  目录