k8s集群架构及基本操作

首先在k8s集群中要知道有两个部署工具:
kubeadm:自动化部署k8s集群的工具。
kubectl: k8s命令行工具,用于接收用户输入的指令。

kubernetes是由什么组成的?

在硬件级别,一个kubernetes集群由很多节点组成,这些节点被分成以下两种类型:

  • 主节点:它承载着kubernetes控制和管理整个集群系统的控制面板
  • 工作节点: 它们运行用户实际部署的应用。

    控制面板(master)

    控制面板用于控制集群并使它工作。它包含多个组件,组件可以运行在单个主节点上或者通过副本分别部署在多个主节点以确保高可用性。

master中的组件有:

注意:master节点默认不参加工作,如果有需要我们可以将它设置为参加工作,但是一般不建议这么做,因为master节点用于负责控制并管理集群,所以非常重要,一般保持默认让它不参加工作即可。

  • APIserver:apiserver是k8s集群中的前端接口,各种客户端工具以及k8s其他组件可以通过它管理集群中的各种资源。
  • Scheduler:负责决定将pod放在那哪个node删运行。在调度的过程中,会考虑集群的节点状态,当前各个节点的负载状况,以及对应调度高可用,性能等需求。
  • Controller manager:负责管理k8s集群的各种资源。保证资源处于用户期望的状态。
  • ectd:多数据中心,负责保存k8s集群的配置信息和各种资源的状态信息,当数据发生变化的时候,etcd会通知k8s集群的其他组件。
  • Pod:是k8s集群里边最小的单位。每个pod里边运行一个或多个container(一般只运行一个)

Node节点组件有:

  • kubelet:是Node节点的代理,当Schedule确定某一个node上运行pod之后,会将pod的 具体配置信息(image,volume)等发送给该节点的kubelet,kubelet根据这些信息创建和运行容器,并向master报告运行状态。
    自动修复功能: 如果某个节点中的容器宕机,它会自动杀死掉,然后重新创建一个容器。
  • kube-Proxy(负载均衡):service在逻辑上代表了后端的多个pod,外界通过service访问pod。
    service接收到的请求是如何转发到pod上?这就是kube-proxy要完成的工作。通过iptables规则来做到负载均衡。


各组件之间是怎样交互的呢?:
首先用户通过kubectl发送部署命令,传到集群中APIserver,APIserver得到指令后,通知Controller Manager创建一个deployment的资源对象,得到确认后,又将指令传给APIserver,APIserver会与etcd进行沟通,etcd会调取集群中的各种资源信息,接下来由Schedule来执行调度,决定将pod分配给集群中的哪个节点来运行。最后kubelet会根据要求在各自节点上创建并运行pod。

k8s基本操作

k8s中各个组件的yaml文件存放位置:

kubernetes默认的名称空间有以下四个:

1)创建一个控制器,部署一个Deployment的资源对象
[[email protected] ~]# kubectl run nginx-deploy --image=nginx --port=80 --replicas=2

参数解释:
kubectl run:运行一个资源对象,后面跟自定义名称
--image: 指定镜像,也就是你要部署的服务
--port: 指定该服务的端口
--replicas:创建2个副本

//查看Deployment资源对象
[[email protected] ~]# kubectl  get deployments. -o wide

参数解释:
-o wide: 加上该参数,显示的内容更宽泛一点
READY:表示所达到的期望值,2/2 表示有2个可用。
AVAILABLE:表示为可用的数

它会自动的去下载镜像(nginx镜像),也可以提前将镜像上传到服务器上,从本地进行下载。

//查看pod运行到哪个节点之上:(包括显示pod的ip地址)
[[email protected] ~]# kubectl get pod -o wide


以上pod分配的ip地址是在我们初始化集群时,指定官方提供的pod网络中的网段。

一个pod中会有两种容器(其中):
USR,MNT,PID是相互隔离的
UTS,IPC,NET是相互共享的

2)service-暴露资源:(暴露端口给外网)
#如果外网想要访问k8s中提供的服务,就必须创建一个service的资源对象。

[[email protected] ~]# kubectl expose deployment  nginx-deploy --name=myweb --port=80 --type=NodePort
service/myweb exposed

参数解释:
expose: 暴露端口
nginx-deploy:暴露名称为nginx-deploy的资源对象
--name: 自定义名称myweb
--port:指定端口80
--type:指定类型nodeport

#其实上面就相当于是创建了个service。

//查看service映射出来的资源对象:
[[email protected] ~]# kubectl get service

解释:
CLUSTER-IP:统一的一个集群接口,为集群内部通信的地址。
80:32326/TCP:80为服务端口,后面的端口是暴露给外网的(随机生成,范围是30000-32767)

//外网测试通过该暴露的端口来访问集群web界面:
url:http://172.16.1.30:30400/



需要知道的是集群中的任何一台主机都是可以进行访问的,不是只有master。

3)手动删除节点上的容器,然后再次查看Deployment资源对象,查看Pod是否维持在用户所期望的数量?IP地址是否有变化?

[[email protected] ~]# kubectl  get pod -o wide  #查看pod分配的节点
NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-deploy-59f5f764bb-h7pv2   1/1     Running   0          44m   10.244.1.2   node01   <none>           <none>
nginx-deploy-59f5f764bb-x2cwj   1/1     Running   0          44m   10.244.2.2   node02   <none>           <none>
在node01上删除容器:
[[email protected] ~]# docker ps 

[[email protected] ~]# docker rm -f 47e17e93d911

//再次查看Deployment资源对象:
[[email protected] ~]# kubectl  get deployments. -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS     IMAGES   SELECTOR
nginx-deploy   2/2     2            2           48m   nginx-deploy   nginx    run=nginx-deploy
//查看pod
[[email protected] ~]# kubectl  get pod -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-deploy-59f5f764bb-h7pv2   1/1     Running   0          50m   10.244.1.2   node01   <none>           <none>
nginx-deploy-59f5f764bb-x2cwj   1/1     Running   0          50m   10.244.2.2   node02   <none>           <none>

可以看pod还是维持在我们所期望的数量,并且pod的ip地址也是没有变化的,你会发现当你删除节点上的容器时,它会马上自动生成一个新的pod。这是为什么呢?
其实是通过集群中controller manager组件来保证资源处于用户所期望的状态,就是说当你定义副本时,你定义了2个,它会保证你一直运行着2个pod,如果少了,会进行增加。

kube-proxy实现负载均衡的底层原理

1)首先我们创建一个deployment+service的资源对象,定义副本数量3个

[[email protected] yaml]# vim nginx.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: nginx-deploy
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: web-server
    spec:
      containers:
      - name: nginx
        image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: NodePort
  selector:
    app: web-server
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80
    nodePort: 30000
//执行yaml文件:
[[email protected] yaml]# kubectl apply -f  nginx.yaml
deployment.extensions/nginx-deploy configured
service/nginx-svc created
//查看pod:
[[email protected] yaml]# kubectl  get pod
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-56558c8dc7-gq9dt   1/1     Running   0          18s
nginx-deploy-56558c8dc7-jj5fv   1/1     Running   0          18s
nginx-deploy-56558c8dc7-z5sq4   1/1     Running   0          17s

//查看service:

2)分别进入pod修改每个pod的默认访问界面(确保界面不同)。。。。。。。

3)访问界面,验证是否会有轮询效果:

[[email protected] yaml]# curl 172.16.1.30:30000
nginx-version:No1
[[email protected] yaml]# curl 172.16.1.30:30000
nginx-version:No2
[[email protected] yaml]# curl 172.16.1.30:30000
nginx-version:No3
[[email protected] yaml]# curl 172.16.1.30:30000
nginx-version:No2
[[email protected] yaml]# curl 172.16.1.30:30000
nginx-version:No1
[[email protected] yaml]# curl 172.16.1.30:30000
nginx-version:No3
[[email protected] yaml]# curl 172.16.1.30:30000
nginx-version:No1
[[email protected] yaml]# curl 172.16.1.30:30000
nginx-version:No2

可以看到访问页面是会有轮询效果的,虽然靠的是kube-proxy组件来实现负载均衡的底层原理的,但主要通过iptables规则来实现负载均衡的。
详细过程如下:

//首先我们查看一下Cluster ip的地址:

//接下来通过查看iptables规则:
[[email protected] yaml]# iptables-save
//找到集群ip的转发规则:

##它会跳转到另一个规则,我们来查看这个值:

以上的值是它实现负载均衡随机算出的平均值,我们前面有3个副本,第一次是1/3的概率(%0.3),分配完,第二次和第三次就是1/2的概率了(%0.5)。第三次就没有详细的显示出它的一个概率了,但我们知道它的概率也是%0.5。

//接下来我们分别通过上面它跳转的另一个规则,来查看ip地址:



// DNAT是目标地址转换,我们接下来查看pod的信息:

可以看到是负载均衡的分配到各个节点,这就体现了它的一个原理。

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/13972012/2455113

时间: 2024-11-01 14:55:23

k8s集群架构及基本操作的相关文章

k8s集群架构和概念简述

k8s集群一般由master节点.node节点.etcd数据库.独立存储组成.生产环境总,master节台至少有3台,etcd可以安装在单独的服务器上,也可以安装在master节点上.etcd是保存集群状态的数据库. k8s调度的最小逻辑单元是pod,而pod由一个或多个业务容器和一个根容器(Pause 容器)组成,主要有4类pod:1.kube-system空间内的系统pod2.在master上手动创建的pod3.在master上由各控制器自动创建的pod4.在node上手动创建的不受mast

(一)Kubernetes/K8s 集群架构与组件

K8s相关概念:master/nodemaster Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行,实现高可用,可以运行多个 Master.运行的相关组件:Kubernetes API Server(kube-apiserver),集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储.Kubernetes Controller Manager,处理集群中常规后

k8s集群搭建

k8s简介 kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写.是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制 k8s的资源对象 master kubernetes里的master指的是集群控制节点,在每个kubernetes集群里都需要有一个master来负责真个集群的管理和控制,在master上运行着以下关键进

k8s集群之日志收集EFK架构

参考文档 http://tonybai.com/2017/03/03/implement-kubernetes-cluster-level-logging-with-fluentd-and-elasticsearch-stack/ https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch https://t.goodrain.com/t/k8s/242 http://logz

MongoDB分片存储的集群架构实现

MongoDB分片存储的集群架构实现 如果需要存储大量数据,或者系统的读写吞吐量很大的时候,单个server就很难满足需求了.这个时候我们可以使用MongoDB的分片机制来解决这些问题. 分片的基本概念 分片(sharding)是一种水平扩展(horizontal scaling)的方式,把一个大的数据集分散到多个片服务器上,所有的片服务器将组成一个逻辑上的数据库来存储这个大的数据集.分片对用户(应用层)是透明的,用户不会知道数据很被存放到哪个片服务器上. 这种方式有两个好处: 分片之后,每个片

Linux服务器集群架构部署搭建(二)linux防火墙iptables使用及NAT共享

第一章 外网防火墙部署企业应用 1.1 生产中iptables的实际应用 ①iptables是基于内核的防火墙,功能非常强大,基于数据包的过滤!特别是可以在一台非常低的硬件配置下跑的非常好.iptables主要工作在OSI七层的2.3.4层.七层的控制可以使用squid代理+iptables. ②iptabes:生产中根据具体情况,一般,内网关闭,外网打开.大并发的情况不能开iptables,影响性能,iptables是要消耗CPU的,所以大并发的情况下,我们使用硬件防火墙的各方面做的很仔细.s

K8S集群中部署jenkins

本文介绍在k8s环境中进行jenkins server的部署和配置.Jenkins是一个开源的.功能强大的持续集成和持续构建工具,采用master和salve架构,我们通过将jenkins集成环境部署在k8s集群中,可以实现jenkins slave按需创建.动态的伸缩.同时也提供了在k8s环境中应用的持续部署解决方案. 一.准备docker镜像文件 1.编译jenkins server docker镜像,默认的jenkis镜像已包含jdk,版本为1.8.0_171 # cat dockerfi

Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 master 服务器的组件有:kube-apiserver.kube-controller-manager.kube-scheduler 因此需要下载k8s master,下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGE

使用k8s集群内解析服务

curl https://saas-pay-gray.XXX.cn/ping 外网 curl https://vpc-saas-pay-gray.XXX.cn/ping slb,即阿里云内网 1/3包是通的 当时设计slb(vpc)的时候考虑到具体功能,除了日常使用使用内网拉取容器镜像的功能之外,是否还有其他? 由于公司架构使用了k8s集群,k8s内部有做了一套完整的解析:即不经过slb,直接通过k8s集群内DNS解析调用服务 servicename curl saas-pay-gray/pin