Kubernetes的架构与基本概念及创建资源

Kubernetes的架构与基本概念及创建资源_第1张图片

架构

从borg到k8s

BorgMaster专门负责请求分发类似大脑,而工作节点是由Borglet负责提供(容器,计算,服务等等),上述都有多个副本3,5,7,9可以防止选举出现双数导致的问题。

提供了多种访问方式,浏览器,命令行,文件------->BrogMaster-------->scheduler(调度器)写入paxos数据库存储,并进行监听,如果发现请求就进入消费环节。

K8S

特点:

      轻量级:消耗资源小

      开源

      弹性伸缩

      负载均衡:iptables IPVS
      
 基础概念:什么是pod  控制器类型   K8S网络通讯模式---flannel---pod--etcd
 
 kubernetes:  构建k8s集群
 
 资源清单: 资源  掌握资源清单的语法yaml  编写pod   掌握pod的生命周期
 
 pod控制器:各种控制器的特点及使用定义方式
 
 服务发现:掌握svc原理及其构建方式
 
 存储:掌握多种存储类型的特点,并且能够在不同环境中选择合适的存储方案(工作中自主选择)

-------------------------------------------
k8s组件:

kubectl: k8s是命令行端,用来发送客户的操作指令。

API server: 是k8s 集群的前端接口,各种客户端工具以及k8s的其他组件可以通过它管理k8s集群的各种资源。它提供了HTTP/HTTPS RESTful API,即K8S API。是所有服务访问的统一入口。

Scheduler: 负责决定将Pod放在哪个Node上运行。在调度时,会充分考虑集群的拓扑结构,当前各个节点的负载情况,以及应对高可用、性能、数据亲和性和需求。负责介绍任务,选择合适的节点进行分配任务。

Controller Manager: 负责管理集群的各种资源,保证资源处于预期的状态,用来维持副本期望数量。它由多种Controller 组成,包括Replication Controller维护副本数量即期望值,创建删除pod、Endpoints Controller、Namespace Controller、Serviceaccounts Controller等等。

Etcd: 键值对数据库 存储k8s集群所有重要信息(持久化),负责保存k8s集群的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速的通知k8s相关组件。第三方组件,它有可替换方案 Consul、zookeeper。

    Etcd的官方将它定位成一个**可信赖**(天生支持集群化)的**分布式键值存储服务**(k-v结构),能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。

    V2版本会把所有数据写入到内存中,关机后数据丢失

    V3版本会做本地持久化,写入到本地存储。

Kubelet: 它是Node的agent(代理),当Scheduler确定某个Node上运行Pod之后,会将Pod的具体配置信息发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向Master报告运行状态。管理(增删改查)Pod.

kube-proxy: 负责将访问service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。

COREDNS: 可以为集群中的SVC创建一个域名IP的对应关系解析 

DASEBORD: 给k8s提供一个B/S结构的UI界面。

INGRESS Crontroller:官方只能实现4层负载均衡,它可以实现7层负载均衡。

Pod:k8s集群的最小组成单位。一个Pod内,可以运行一个或多个容器。大多数情况下,一个Pod内只有一个Container容器。

Flannel: 是k8s集群网路方案,可以保证Pod的跨主机通信。第三方解决方案,也有替换方案。

服务分类:
    有状态服务:DBMS数据库管理系统(MYSQL)从pod中剔除后,再恢复就会造成数据丢失。
    无状态服务:LVS APACHE NGINX

    对docker来说更适合运行无状态服务,对k8s来说目标就是可以运行好有状态服务


运行一个例子:

#创建一个deployment资源对象。Pod控制器。

kubectl run test-web --image=httpd --replicas=2 


注:k8s 1.15之前的命令


分析各个组件的作用以及架构工作流程:*****

1. kubectl发送部署请求到API server
2. APIserver通知Controller Manager 创建一个Deployment资源。
3. Scheduler执行调度任务,将两个副本Pod分发到node上。
4. node上的kubelet在各自节点上创建并运行Pod。

补充:

​    1.应用的配置和当前的状态信息保存在etcd中,执行kubectl  get pod  时 API server 会从etcd中读取这些数据。

     2. flannel会为每个Pod分配一个IP。但此时没有创建Service资源,目前kube-proxy还没有参与进来。

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

常见资源对象类型( pod控制器类型)

ReplicationController: 用于确保每个Pod副本在任意时刻都能满足目标数量,简单点来说,它用于保证每个容器或容器组总是运行并且可以访问的:老一代无状态的Pod应用控制器。

ReplicaSet: 新一代的无状态的Pod应用控制器,它与RC的不同之处在于支持的标签选择器不同,RC只支持等值选择器,RS还额外支持基于集合的选择器。

Deployment: 为Pod和Replicaset提供了一个声明式定义(declarative)方法,用来替代以前的ReplicaionController来方便的管理应用。
    典型的应用场景:
            定义Deployment来创建Pod和ReplicaSet
            滚动升级和回滚应用
            扩容和缩容
            暂停和继续Deployment


DaemonSet: 用于确保每一个节点都运行了某个Pod的一个副本,新增的节点一样会被添加此类Pod,在节点移除时,此类Pod会被回收。
    典型的应用场景:
            运行集群存储daemon
            在node上运行日志收集daemon
            在node上运行监控daemon
            

StatefulSet:  用于管理有状态的持久化应用,如database服务程序,它与Deployment不同之处在于,它会为每一个Pod创建一个独有的持久性标识符,并确保每个Pod之间的顺序性。
    典型的应用场景:
            稳定的持久化存储
            稳定的网络标志
            有序部署,有序扩展
            有序收缩,有序删除

Job: 用于管理运行完成后即可终止的应用,例如批量处理作业任务,保证一次性任务pod成功结束。

Cronjob:管理基于时间的job,即:    
            在给定的时间点只运行一次
            周期性地在给定时间点运行

Horizontal Pod Autoscaling: 应用的资源使用率通常都有高峰和低谷,削峰填谷,提高集群的整体资源利用率,让service的pod个数自动调整,使pod水平自动缩放。

kubernetes集群命令行

1.kubectl语法格式:

   kubectl [command] [TYPE] [NAME] [flags]

  (1)command:指定要对资源执行的操作,例如create,get,describe和delete

  (2)TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数,复数和缩略的形式。例如:  

kubectl get pod pod1

kubectl get pods pod1

kubectl get po pod1

  (3)NAME:指定资源的名称,名称也是大小写敏感的。如果省略名称,则会显示所有的资源。例如:

kubectl get pods

  (4)flages:指定可选的参数。例如,可用-s或者-server参数指定k8s API server的地址和端口。


2.kubectl获取帮助 

kubectl --help

具体查看某个操作的帮助

kubectl get --help


3.kubectl子命令使用分类

基础命令:
    create:通过文件名或标准输入创建资源
    expose:将资源公开为一个新的服务
    run:在集群中运行一个特定的镜像
    set:在对象上设置特定的功能
    get:显示一个或多个资源
    explain:文档参考资料
    edit:使用编辑器编辑一个资源
    delete:删除资源
部署命令:
    rollout: 管理资源的发布
    rolling-update: 滚动更新
    scale: 扩、缩容
    autoscale:自动扩缩容
集群管理命令:
    certificate: 修改证书资源
    cluster-info:显示集群信息    
    top: 显示资源(cpu,内存,存储)
    cordon: 标记节点不可调度
    uncordon: 标记节点可调度
    drain: 维护期间下线
    taint: 更新污点数
故障诊断和调试命令:
    describe: 显示特定资源或资源组的详细信息
    logs: 在一个Pod中打印一个容器日志
    attach:附加到一个运行的容器
    exec:执行命令到容器
    port-forward: 转发本地端口到pod
    proxy: 运行一个proxy到api server
    cp: 复制文件目录到容器
    auth:检查授权
高级命令:
    apply: 通过文件或标准输入对资源应用配置
    patch:使用补丁修改、更新资源的字段
    replace:通过文件或标准输入替换一个资源
    convert: 不同的api版本之间转换配置文件
设置命令:
    label:更新资源上的标签
    annotate: 更新资源上的注释
    completion: 用于实现kubectl工具自动补全
其他命令:
    api-versions: 打印受支持的api版本
    config:修改kubeconfig文件(用于访问api,配置认证信息等)
    help: 帮助
    plugin:运行一个命令行插件
    version:打印客户端和服务版本信息    

(1)基础命令    

kubectl create deployment nginx --image=nginx #创建一个pod控制器

kubectl expose deployment nginx --name=nginx-svc --port=80 --type=NodePort     

#对外暴露端口 其他主机可以访问 在浏览器中打开http://ip:端口

kubectl get pod,svc,cs     #查询pod和详细信息及运行状况 

kubectl get pod(deployment) -o wide #输出pod,deployment资源的信息pod资源包含ip地址,deployment包含名称,镜像来源。

kubectl describe pod nginx #查看名字叫nginx的pod的详细信息 ip等 *****


用命令行的方式创建:

//创建Pod控制器,deployment(到k8s:1.18版本,此方式已变为创建Pod资源)


kubectl run web --image=nginx --replicas=5  #1.15版本方式,在1.18版本中此方式只会创建一个pod资源
    
kubectl create deployment web --image=nginx:latest  #1.18 版本创建pod控制器方式


#查看控制器情况

kubectl get deployment  
        

#查看资源详细信息

kubectl describe deployment web


PS:  查看某种资源对象,没有指定名称空间,默认是在default名称空间。可以加上-n选项,查看指定名称空间的资源。

注意:直接运行创建的Deployment资源对象,是经常使用的一个控制器资源类型,除了deployment,还有rc,rs等Pod控制器,Deployment是一个高级的Pod控制器。


//创建Service资源类型。

kubectl expose deployment web --name=web-svc --port=80 --type=NodePort

//ps:kubectl get service //查看service资源 和暴露端口 其中web-svc 对应的30921是整个k8s集群对外暴露的端口不指定对外暴露端口的情况下,会随机生成端口类似于docker 中的-P 80

[root@docker01 ~]# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1              443/TCP        4h12m
nginx        NodePort    10.108.14.253          80:32148/TCP   138m
web-svc      NodePort    10.97.171.7            80:30921/TCP   10m

[root@docker01 ~]# crul 192.168.10.170:30921

ps:如果想要外网能够访问服务,可以暴露deployment资源,得到service资源,但svc资源的类型必须为NodePort(大小写必须严格按照要求)。

**服务的扩容与缩容**

kubectl scale deployment web --replicas=8.    
kubectl edit deployment web
   #编辑web资源的配置文件

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

##### 服务升级(变更镜像)与回滚  *****

#删除旧的nginx控制器
kubectl delete deployment nginx 

#重新创建nginx:1.17的控制器
kubectl create deployment nginx --image=nginx:1.17
kubectl describe pod nginx-...    (补全)

#升级到nginx:1.18
kubectl set image deployment nginx nginx=nginx:1.18
kubectl describe pod nginx-...    (补全)

#升级到nginx:latest 
kubectl set image deployment nginx nginx=nginx:latest
kubectl describe pod nginx-...    (补全)

#回滚  回滚成上次的镜像
kubectl rollout undo deployment nginx 


常用命令集合

kubectl run       #创建一个deployment或job来管理创建的容器   1.18中 用kubectl create创建deployment资源

kubectl get       #显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源

kubectl expose    #将一个资源暴露为一个新的kubernetes的service资源,资源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs)

kubectl describe  #显示特定资源或资源组的详细信息

kubectl scale     #可以对Deployment, ReplicaSet, Replication Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件

kubectl set       #更改现有的应用程序资源

kubectl rollout   #资源回滚管理

kubectl delete    #删除某个资源  PS: 如果资源状态为Terminating,可以强制删除,比如强制删除某个Pod:kubectl  delete po  --grace-period=0 --force 

----------------------------------------
## 配置清单(yml、yaml):

常见Yaml文件写法:以及字段的作用

1.语法格式

*通过缩进表示层级关系

*不能使用Tab进行缩进,只能使用空格。(高版本支持缩进我们设置为tab一次缩进2个空格,写法尽量要统一用缩进,或都用空格)
vim /root/.vimrc
set tabstop=2

*一般文件开头缩进两个空格

*字符后面缩进一个空格,比如冒号,逗号等后面

*使用---表示yaml文件开始

*使用#代表注释


2.一级字段作用 5个 (apiVersion、kind、metadata、spec、status)一般只考虑前4个。

apiVersion:    api版本信息 

apiVersion: v1 //apiserver的版本  
    
    
kind:   资源对象的类别

kind: Pod         //指明创建的资源类型


metadata:  元数据  名称字段必写。

metadata:  

  name: deploy1                 //meatdata字段下必须有name这个二级字段定义名称

         ["a","b","c"]     (字典写法)
         - a

         - b

         - c


spec:用户期望的状态。

spec的例子:只删除pod,deployment会按照spec期望值重新生成pod

[root@master ~]# kubectl get deployments.apps 
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           20m


[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-755c56db9f-hp8w9   1/1     Running   0          9m40s


[root@master ~]# kubectl delete pod nginx-755c56db9f-hp8w9 
pod "nginx-755c56db9f-hp8w9" deleted

[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-755c56db9f-gjmsr   1/1     Running   0          5s

通过例子可以看到,spec:下面期望有1个副本,删除掉其中一个后,发现还是1个,这时注意一下运行时间发现已经删除掉旧的的,但会根据期望值创建一个新的。维持spec的期望值不变。


status: 资源现在处于什么样的状态。通常创建yaml时不用写,是描述现在的状态的,和spec做对比。


=================================================


可以使用kubectl explain 命令查看我们要写的资源对象的yaml文件怎么写。比如查看deployment资源的话就可以写成:    

kubectl explain deploy

kubectl explain deployment.metadata #查看deployment下matedata字段的写法帮助


##### 如何快速编写yaml文件

第一种 使用kubectl create命令生成yaml文件,生成过程中并不执行,主要是要生成yaml文件。

第二种 当资源已经部署过了,可以直接使用kubectl get命令导出yaml文件,在此基础上编辑。


第一种:

kubectl create deployment web --image=nginx -o yaml --dry-run > myl.yaml #并不真正执行,只会输出yaml文件。
kubectl apply -f my1.yaml  #执行yaml文件生成资源


    
    

第二种:

kubectl get deploy nginx -o=yaml --export > my2.yaml


----------------------------------------------------
##### 动手写第一yaml文件

#写第一yaml文件
mkdir /root/yaml
vim /root/yaml/deploy1.yaml


**Deployment**

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.18
        ports:
        - containerPort: 80

在该例中:
apiVersion    API版本
kind        资源类型
metadata    资源元数据
spec        资源规格,期望
replicas    副本数量
selector    标签选择器
template    Pod模板
metadata    Pod元数据
spec        Pod规格
container    容器配置

创建名为 nginx-deployment(由 .metadata.name 字段标明)的 Deployment。
该 Deployment 创建三个(由 replicas 字段标明)Pod 副本。

selector 字段定义 Deployment 如何查找要管理的 Pods。 在这里,你只需选择在 Pod 模板中定义的标签(app: nginx)。 不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可。

说明: matchLabels 字段是 {key,value} 偶对的映射。在 matchLabels 映射中的单个 {key,value} 映射等效于 matchExpressions 中的一个元素,即其 key 字段是 “key”,operator 为 “In”,value 数组仅包含 “value”。在 matchLabels 和 matchExpressions 中给出的所有条件都必须满足才能匹配。

template 字段包含以下子字段:
    Pod 被使用 labels 字段打上 app: nginx 标签。
    Pod 模板规约(即 .template.spec 字段)指示 Pods 运行一个 nginx 容器, 该容器运行版本为 1.18 的nginx Docker Hub镜像。
    创建一个容器并使用 name 字段将其命名为 nginx。
    开始之前,请确保的 Kubernetes 集群已启动并运行。 按照以下步骤创建上述 Deployment

执行yaml文件:
kubectl apply -f deploy1.yaml


##### 更新Deployment

更新 Deployment
你可以通过更新一个新的 YAML 文件来更新 Deployment。下面的 YAML 文件指定该 Deployment 镜像更新为 nginx:latest。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest 
        ports:
        - containerPort: 80


#使用kubectl  apply 命令运行yaml文件。

kubectl apply -f deploy1.yaml


##### //在线命令方式更新

kubectl edit deployment nginx-deployment

kubectl get deployments

kubectl edit deployment nginx-deployment #把副本数量修改成5个,镜像换成httpd

kubectl get deployments

kubectl get pod -o wide

kubectl get deployment -o wide


 

 

你可能感兴趣的:(k8s,架构,k8s)