You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
【与Deployments区别:它们都能创建 Pod,并且 Pod 中的进程都不希望被终止。建议为无状态的服务使用 Deployments,比如前端服务。 对这些服务而言,对副本的数量进行扩缩容、平滑升级,比精确控制 Pod 运行在某个主机上要重要得多。 当需要 Pod 副本总是运行在全部或特定主机上,并需要它们先于其他 Pod 启动时, 应该使用 DaemonSet。】
pod间通信: 每个 Pod 获得一个唯一的 IP 地址, Pod 中的每个容器共享一个 IP 地址和端口空间,并且可以通过 localhost 发现对方。因为每个pod有自己的IP,因此pod可以在没有代理或者转换的情况下进行通信。当任何容器调用获取接口地址的方法时,看到的都是所属pod的IP地址。通过使pod内部和外部的IP地址+端口相同,可以创建一个无NAT的扁平的空间,而pod内部的容器通过卷或者IPC通信。
k8s集群搭建及服务部署
Kubernetes(k8s)是一个开源的容器集群管理装置,可以实现容器集群的自动化部署,自动化扩容缩容,维护等功能。本文将会记录在虚拟机上搭建k8s集群并部署应用的过程。
前置知识
组成
k8s集群会将机子按照功能分成两种:Control Plane, Node,功能和内部组件分别如下:
Control Plane
负责对集群做出全局决策,检测和响应集群事件,包括以下组件:
api server:作为control plane的前端暴露API供node使用。可以运行多个api server以平衡Node的流量
etcd:键值存储数据库,作为所有集群数据的后备存储
scheduler:为没有分配到node的pod分配node
controller manager:运行控制器进程
包括node控制器(对node挂掉做出相应),job控制器(监视一次性任务的job对象,然后创建pod运行直至任务完成),endpoints控制器(填充endpoints对象到指定位置),service account & token 控制器(为新的命名空间创建默认账户和API访问令牌)
cloud controller manager:该组件允许用户将集群链接到云提供商的API。
Node
维护正在运行的pod并且提供kubernets运行的环境,包括以下组件:
一些概念
Namespace
Kubernetes支持由同一个物理集群支持多个虚拟集群。这些虚拟集群成为命名空间。
资源名称在一个命名空间内必须是唯一的,因此可以使用命名空间内在多个用户之间划分居群资源。
注意:Kubernetes的命名空间不能嵌套,每个资源只能在一个命名空间中
Pod
pod是可以在Kubernetes中创建和管理的最小的计算单元。其所建模的是一台特殊的逻辑主机,内部有一个或多个容器,这些容器共享存储,网络以及怎样运行这些容器的声明。用户可以使用工作负载资源来创建和管理多个pod。资源控制器能够处理副本的管理,上线,并在pod失效时提供自愈能力。
工作负载资源
工作负载是指在Kubernetes上运行的应用程序。工作负载资源指管理工作负载的方式,以下列举了部分可能用到的资源。
Deployments 为pods和ReplicaSets声明理想的运行状态 。
ReplicaSet 目的是保证一定数量的完全相同的pod的可用性。
DaemonSet 确保一定数量的节点上运行一个pod的副本。当有节点加入集群时会为他们新增pod,而当有节点移除时则回收该pod。删除daemonset会删除它创建的所有pod
【与Deployments区别:它们都能创建 Pod,并且 Pod 中的进程都不希望被终止。建议为无状态的服务使用 Deployments,比如前端服务。 对这些服务而言,对副本的数量进行扩缩容、平滑升级,比精确控制 Pod 运行在某个主机上要重要得多。 当需要 Pod 副本总是运行在全部或特定主机上,并需要它们先于其他 Pod 启动时, 应该使用 DaemonSet。】
Job 负责批处理任务,即仅执行一次的任务。会创建一个或者多个 Pods,并将继续重试 Pods 的执行,直到指定数量的 Pods 成功终止。
...
Service(服务)
服务指运行在一组pod上的应用程序公开的网络服务方法,通过选择算符实现(即查询标签)实现与pod的绑定。在集群中是一个REST对象,k8s会为服务分配一个虚拟IP。任何连接服务到请求,会首先访问iptables,内部的规则已经被kube-proxy改写,然后根据跳转规则代理到对应的pod中,一般通过轮转算法选择后端。
service在k8s中有四种类型:
网络模型?
k8s需要轻量地实现容器间的通信,pod间的通信,pod与服务的通信,以及内部与外部的通信。主要思路参考了docker:**让每个pod拥有一个IP,使得pod可以像虚拟机或者物理主机一样对待。**但是不应该使用NAT,因为NAT通过寻址空间引入了额外的复杂性,这样会破坏动态自注册的机制。
容器间通信: 一个pod中的所有容器的行为像是在同一台主机上,他们可以通过本地主机访问彼此的端口。几点好处:1.方便设置态端口;2.pod外部不可见,更安全 3.减少软件迁移的摩擦
pod间通信: 每个 Pod 获得一个唯一的 IP 地址, Pod 中的每个容器共享一个 IP 地址和端口空间,并且可以通过 localhost 发现对方。因为每个pod有自己的IP,因此pod可以在没有代理或者转换的情况下进行通信。当任何容器调用获取接口地址的方法时,看到的都是所属pod的IP地址。通过使pod内部和外部的IP地址+端口相同,可以创建一个无NAT的扁平的空间,而pod内部的容器通过卷或者IPC通信。
pod与服务间通信: 不同服务会对pod进行不同的分组。为了访问到对应的pod会创建一个虚拟IP,client访问该IP时会被透明地代理到服务中对应的pod。每个node都运行着k-proxy进程,该进程对iptables规则进行修改以捕获对服务IP的访问并将他们代理到对应的pod。
外部与内部间通信: 目前的做法是设置外部均衡负载器(比如ingress),以集群中所有节点为目标。当流量到达节点时,该负载均衡器将这些流量也视为服务的一部分,并路由到特定的pod。但存在某些流量在网络内不断回弹的情况。
搭建准备
此次搭建准备了三台处于同一子网的虚拟机,操作系统是ubuntu20.04。约定192.168.137.71为Master,负责运行Control Plane,其余两台为Node。注意:虚机需要至少2*CPU核,并且关闭swap!
因为网络环境已经在墙外,后面的步骤将不会涉及类似配代理或更换源的步骤。
安装过程
1.Master安装Docker
2.为集群设置hostname
3.为集群配置iptables及内核
4. Master安装kubeadm kubelet kubbectl
5.Master编辑配置文件
6.Master拉取镜像及初始化
初始化结束后,需要再复制配置文件,修改权限及添加node,根据提示操作即可。
7.安装Flannel插件
Kubernetes默认没有实现Pod虚拟IP的机制,因此需要安装其他插件。
补充:如果搭崩了需要重新来
sudo rm -rf /etc/kubernetes/* kubeadm reset
服务部署
1.配置Deployment
(https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/)
2. 部署service
3.Ingress暴露服务
参考
https://kubernetes.io/zh/docs/home/
http://docs.kubernetes.org.cn/
https://www.bilibili.com/video/BV1w4411y7Go?from=search&seid=5693729189842432826
https://www.bilibili.com/video/BV1Pi4y1L7XC?from=search&seid=5693729189842432826
https://zhuanlan.zhihu.com/p/143156163
The text was updated successfully, but these errors were encountered: