kubernetes(k8s) 基础概念

K8S基础概念

1、Node

Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的Kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁、以及实现软件模式的负载均衡。

Node包含的信息:

  • Node地址:主机的IP地址,或Node ID。
  • Node的运行状态:Pending、Running、Terminated三种状态。
  • Node Condition:…
  • Node系统容量:描述Node可用的系统资源,包括CPU、内存、最大可调度Pod数量等。
  • 其他:内核版本号、Kubernetes版本等。

查看Node信息:

kubectl describe node

2、Pod

Pod是Kubernetes最基本的操作单元,包含一个或多个紧密相关的容器,一个Pod可以被一个容器化的环境看作应用层的“逻辑宿主机”;一个Pod中的多个容器应用通常是紧密耦合的,Pod在Node上被创建、启动或者销毁;每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。

同一个Pod里的容器之间仅需通过localhost就能互相通信。

一个Pod中的应用容器共享同一组资源:

  • PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID;
  • 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围;
  • IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信;
  • UTS命名空间:Pod中的多个容器共享一个主机名;
  • Volumes(共享存储卷):Pod中的各个容器可以访问在Pod级别定义的Volumes;

Pod的生命周期通过Replication Controller来管理;通过模板进行定义,然后分配到一个Node上运行,在Pod所包含容器运行结束后,Pod结束。

Kubernetes为Pod设计了一套独特的网络配置,包括:为每个Pod分配一个IP地址,使用Pod名作为容器间通信的主机名等。

3、Service

在Kubernetes的世界里,虽然每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,这就引出一个问题:如果有一组Pod组成一个集群来提供服务,那么如何来访问它呢?Service!

一个Service可以看作一组提供相同服务的Pod的对外访问接口,Service作用于哪些Pod是通过Label Selector来定义的。

  • 拥有一个指定的名字(比如my-mysql-server);
  • 拥有一个虚拟IP(Cluster IP、Service IP或VIP)和端口号,销毁之前不会改变,只能内网访问;
  • 能够提供某种远程服务能力;
  • 被映射到了提供这种服务能力的一组容器应用上;

如果Service要提供外网服务,需指定公共IP和NodePort,或外部负载均衡器;

二、Kubernetes总体架构

Master和Node

Kubernetes将集群中的机器划分为一个Master节点和一群工作节点(Node)。其中,Master节点上运行着集群管理相关的一组进程etcd、API Server、Controller Manager、Scheduler,后三个组件构成了Kubernetes的总控中心,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且全都是自动完成。在每个Node上运行Kubelet、Proxy、Docker daemon三个组件,负责对本节点上的Pod的生命周期进行管理,以及实现服务代理的功能。

流程

通过Kubectl提交一个创建RC的请求,该请求通过API Server被写入etcd中,此时Controller Manager通过API Server的监听资源变化的接口监听到这个RC事件,分析之后,发现当前集群中还没有它所对应的Pod实例,于是根据RC里的Pod模板定义生成一个Pod对象,通过API Server写入etcd,接下来,此事件被Scheduler发现,它立即执行一个复杂的调度流程,为这个新Pod选定一个落户的Node,然后通过API Server讲这一结果写入到etcd中,随后,目标Node上运行的Kubelet进程通过API Server监测到这个“新生的”Pod,并按照它的定义,启动该Pod并任劳任怨地负责它的下半生,直到Pod的生命结束。

随后,我们通过Kubectl提交一个新的映射到该Pod的Service的创建请求,Controller Manager会通过Label标签查询到相关联的Pod实例,然后生成Service的Endpoints信息,并通过API Server写入到etcd中,接下来,所有Node上运行的Proxy进程通过API Server查询并监听Service对象与其对应的Endpoints信息,建立一个软件方式的负载均衡器来实现Service访问到后端Pod的流量转发功能。

  • etcd

用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。

etcd是一个键值存储仓库,用于配置共享和服务发现。etcd受Zookeeper与doozer启发而催生的项目。

etcd存储

etcd的存储分为内部存储和持久化(硬盘)存储两部分。内存中的存储除了顺序化地记录所有用户对节点数据变更的记录外,还会对用户数据进行索引、建堆等方便查询的操作。而持久化则使用WAL进行记录存储。在k8s中,所有数据的存储以及操作记录都在etcd中进行存储,所以对于k8s集群来说,etcd是相当重要的,一旦故障,可能导致整个集群的瘫痪或者数据丢失。

在WAL体系中,所有的数据在提交之前都会进行日志记录。持久化存储的目录分为两个:snap和wal。snapshot相当于数据压缩,默认会将10000条wal操作记录merge成snapshot,节省存储,又保证数据不会丢失。

WAL:存储所有事务的变化记录

Snapshot:用于存放某一时刻etcd所有目录的数据

  • API Server

提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。

  • Controller Manager

集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。

  • Scheduler

集群中的调度器,负责Pod在集群节点中的调度分配。

  • Kubelet

负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。

  • Proxy

实现了Service的代理与软件模式的负载均衡器。

客户端通过Kubectl命令行工具或Kubectl Proxy来访问Kubernetes系统,在Kubernetes集群内部的客户端可以直接使用Kuberctl命令管理集群。Kubectl Proxy是API Server的一个反向代理,在Kubernetes集群外部的客户端可以通过Kubernetes Proxy来访问API Server。

API Server内部有一套完备的安全机制,包括认证、授权和准入控制等相关模块。

###################################

安装kubernetes

master:192.168.1.50

node:192.168.1.117

Master:

1、在Master上安装kubernetes etcd flannel

yum install kubernetes etcd flannel -y

2、修改配置文件/etc/kubernetes/controller-manager

#指定key文件,key文件可以通过命令生成:openssl genrsa -out /etc/kubernetes/service.key 2048

KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/service.key"

3 修改配置文件/etc/kubernetes/apiserver

# The address on the local server to listen to. 设为全部监听

KUBE_API_ADDRESS="--address=0.0.0.0"

# Comma separated list of nodes in the etcd cluster . 指定etcd节点的地址

KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.1.50:2379"

# Address range to use for services. 这个是设置今后运行Service所在的ip网段

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=192.168.100.0/24"

# Add your own! 指定key文件

KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/service.key"

4 修改配置文件/etc/kubernetes/config

# How the controller-manager, scheduler, and proxy find the apiserver

KUBE_MASTER="--master=http://192.168.1.50:8080"

5 修改配置文件/etc/etcd/etcd.conf

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.50:2379"

6 启动etcd和kubernetes的服务

systemctl start etcd kube-apiserver kube-controller-manager kube-scheduler

systemctl enable etcd kube-apiserver kube-controller-manager kube-scheduler

7 修改配置文件/etc/sysconfig/flanneld

# etcd url location.  Point this to the server where etcd runs

FLANNEL_ETCD="http://192.168.1.50:2379"

8 设置etcd config的值

# 创建一个文件内容如下,Network指定的IP将为以后容器运行的网段:

cat /etc/sysconfig/flannel-config.json

{

"Network":"172.16.0.0/16",

"SubnetLen":24,

"Backend":{

"Type":"vxlan",

"VNI":1

}

}

# 通过文件内容来设置etc的config

etcdctl set atomic.io/network/config < flannel-config.json

9 启动flannel服务

systemctl start flanneld

systemctl enable flanneld

到这里Master就安装配置完毕,查看master信息:

kubectl cluster-info

----------------------------

node

1 安装kubernetes和flannel

yum -y install kubernetes flannel

2 修改/etc/kubernetes/config

KUBE_MASTER="--master=http://192.168.1.50:8080"

3 修改/etc/kubernetes/kubelet

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)

KUBELET_ADDRESS="--address=0.0.0.0"

# You may leave this blank to use the actual hostname

KUBELET_HOSTNAME="--hostname-override=vm7.cluster.com"

# location of the api-server

KUBELET_API_SERVER="--api-servers=http://192.168.1.50:8080"

4 修改/etc/sysconfig/flanneld

# etcd url location.  Point this to the server where etcd runs

FLANNEL_ETCD="http://192.168.1.50:2379"

5 启动flannel和kube相关服务

# 注意Node和Master上启动的kube的服务是不一样的

systemctl start flanneld kube-proxy kubelet

systemctl enable flanneld kube-proxy kubelet

# 重启docker服务

systemctl restart docker

到此,Node节点配置完毕,可以在Master上执行下面命令查看节点信息

kubectl get nodes

###########################################

实例

利用 Kubernetes 部署个容器

1) 创建一个 web_server 的镜像---在任意 node 节点

# vim Dockfile

# create new

FROM centos

MAINTAINER user1 <[email protected]>

# Update Yum Repostory

RUN curl -s -L http://mirrors.aliyun.com/repo/Centos-7.repo -o \

/etc/yum.repos.d/CentOS7-Base.repo && \

curl -s -L http://mirrors.aliyun.com/repo/epel-7.repo -o \

/etc/yum.repos.d/epel7.repo

RUN yum clean all && \

yum makecache fast && \

yum -y update

yum -y install httpd

RUN yum clean all

EXPOSE 80

CMD ["-D","FOREGROUND"]

ENTRYPOINT ["/usr/sbin/httpd"]

# docker build -t web_server .

# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

web_server latest 875ba006f185 9 seconds ago 337 MB

docker.io/centos latest e934aafc2206 12 hours ago 199 MB

【将此镜像导出来,在另一节点导入,当然也可以直接使用 docker build】

[# http://mirrors.aliyun.com/repo/Centos-7.repo]

2)在 master 创建一个 pod

cat pod-webserver.yaml

apiVersion: v1 kind: Pod metadata: name: httpd spec: containers: - name: httpd image: web_server ports: - containerPort: 80 volumeMounts: # 定义一个挂载目录 /var/www/html - name: httpd-storage # mount point inside Container mountPath: /var/www/html volumes: - name: httpd-storage hostPath: # 把/var/docker/disk01 目录 挂载到窗口中的 /var/www/html path: /var/docker/disk01

创建:

# kubectl create -f pod-webserver.yaml

使用命令查看创建的状态,状态为Pending[准备中],Running 状态[已经创建成功]

# kubectl get pods

查看该容器在哪个节点

# kubectl get pods -o wide

查看该容器的所有状态

# kubectl get pods httpd -o yaml

测试---在node节点

# echo ${HOSTNAME} > /var/docker/disk01/index.html

# curl http://10.1.15.2

删除 Pod

# kubectl delete pod httpd

原文地址:https://www.cnblogs.com/skyzy/p/9226863.html

时间: 2024-08-09 05:40:04

kubernetes(k8s) 基础概念的相关文章

《两地书》--Kubernetes(K8s)基础知识(docker容器技术)

大家都知道历史上有段佳话叫“司马相如和卓文君”.“皑如山上雪,皎若云间月”.卓文君这么美,却也抵不过多情女儿薄情郎. 司马相如因一首<子虚赋>得汉武帝赏识,飞黄腾达之后便要与卓文君“故来相决绝”,寄来给家乡留守的妻子一封<两地书>,上面只有一行数字:“一二三四五六七八九十百千万.”意义是:无亿,我已经无意于你啦. 卓文君看了这封信也不示弱,回了一首<怨郎诗>,司马相如看了发现虽然我是靠写诗吃饭的.要说写诗还是我媳妇厉害,于是亲自将卓文君迎回长安. 卓文君其实是个二婚.头

K8S基础概念

一.核心概念 1.Node Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod.Node上运行着Kubernetes的Kubelet.kube-proxy服务进程,这些服务进程负责Pod的创建.启动.监控.重启.销毁.以及实现软件模式的负载均衡. Node包含的信息: Node地址:主机的IP地址,或Node ID. Node的运行状态:Pending.Running.Terminated三种状态. Node Condition:- No

zookeeper,及k8s基础概念

1.描述zookeeper集群中leader,follower,observer几种角色 Zookeeper: 分布式系统:是一个硬件或软件组件分布在网络中的不同的计算机之上,彼此间仅通过消息传递进行通信和协作的系统. 特征: 分布性.对等性.并发性.缺乏全局时钟.故障必然会发生 典型问题: 通信异常.网络分区.三态(成功.失败.超时).节点故障 zookeeper是一个开源的分面式协调服务,由知名互联网公司Yahoo创建,它是Chubby的开源实现:换句话讲,zk是一个典型的分布式数据一致性解

kubernetes基础概念知多少

kubernetes(简称k8s)是一种用于在一组主机上运行和协同容器化应用程序的管理平台,皆在提供高可用.高扩展性和可预测性的方式来管理容器应用的生命周期.通过k8s,用户可以定义程序运行方式.部署升级策略.动态伸缩容,使得用户以一种更灵活可靠的方式来管理应用程序. 关于k8s,是一种对应用服务的打包.部署.监控等一整套生命周期的自动化管理平台,目前各大公司已在生产环境部署使用,同时k8s社区比较活跃,在未来一段时间内会越来越流行,可以说是以后服务部署的事实标准,对于Java开发者来说,你可以

k8s基础知识和概念

k8s基础知识和概念 一. 简介 kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制. Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务

【k8s】基础概念

基础概念: 将Docker应用于具体的业务实现,是存在困难的——编排.管理和调度等各个方面,都不容易.于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理. K8S,就是基于容器的集群管理平台,它的全称,是kubernetes. 一个K8S系统,通常称为一个K8S集群(Cluster). 这个集群主要包括两个部分: 一个Master节点(主节点) 一群Node节点(计算节点) Master节点主要还是负责管理和控制.Node节点是工作负载节点,里面是具体的容器. Maste

通过实例快速掌握k8s(Kubernetes)核心概念

容器技术是微服务技术的核心技术之一,并随着微服务的流行而迅速成为主流.Docker是容器技术的先驱和奠基者,它出现之后迅速占领市场,几乎成了容器的代名词.但它在开始的时候并没有很好地解决容器的集群问题.Kubernetes抓住了这个机遇,以容器编排者(Container Orchestration)的身份出现,对容器集群进行管理和调度,现在已经打败了Docker成为了容器技术事实上的标准.当然K8s内部还是需要Docker的,但它的功能范围被大大压缩了,只是负责底层的容器引擎和镜像(Docker

k8s基础

参考文档:https://blog.csdn.net/Real_Myth/article/details/78719244 •Kubernetes介绍 1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建,到处运行 - 容器的快速轻量 - 完整的生态环境 2.什么是kubernetes 首先,他是一个全新的基于容器技术的分布式架构领先方案.Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg).在Dock

k8s基本概念-如何使用Services

k8s基本概念-如何使用Services 2018/1/5 Services 使用示例 Virtual IPs and service proxies Publishing services - service types 通过命令行来控制 Service 通过 yaml 配置文件来定义 Service Virtual IPs and service proxies Proxy-mode: userspace 轮询 Proxy-mode: iptables v1.2开始作为默认选项 比 user