Kubenetes基础学习

一:K8s概念

二:k8s学习目的

  • 什么是pod
  • 控制器类型
  • k8s网络通信模式
  • 搭建k8s集群
  • 资源清单:资源 掌握资源清单的语法,编写pod 。掌握pod的全生命周期
  • pod控制器:掌握各种控制器的特点以及使用定义方式
  • 服务发现:掌握svc原理及其构建方式
  • 存储:掌握多种存储类型的特点,并且能够在不同环境中选择合数的存储方案
  • 调度器:掌握调度器原理,能够根据要求把pod调度到制定的node
  • 安全:集群的认证、鉴权、访问控制、原理及其流程
  • helm:linux yum掌握helm原理, helm末班自定义、helm不熟一些常用的插件
  • 运维:修改kubeadm达到证书可用期限为10年,能够构建高可用k8s集群
    服务分类
    * 有状态服务:DBMS数据库管理
    * 无状态服务:Nginx。

三:组件说明

高可用最好为3、5节点

  • apuserver:所有服务访问同一入口
  • ControllerManager:位置副本数期望说明
  • Schedule:负责介绍人物,选择合适的节点进行分配任务
  • etcd:键值对数据库,存储k8s集群所有重要的信息(持久化)
  • kubelet:直接跟容器引擎交互实现容器的生命周期
  • kube-proxy:负责写入规则至iptables、ipvs实现服务映射访问的
  • coredns:可以为集群中的svc创建一个域名ip的对应关系接续
  • dashboard 给k8s集群提供一个b/s结构访问体系
  • Ingress Controller:官方只能实现四层代码,ingress可以实现七层代理
  • federation:提供一个可以跨集群中心多k8s同一管理功能
  • prometheus:提供k8s集群的监控能力
  • elk:提供k8s集群日志统一分析介入平台

四:Pod概念

  • 自主式 pod
  • 控制器管理的pod

控制器的类型

  • replicationController:用来确保容器应用的副本数始终保持在用户定义的副本数,如果有容器异常时,会自动创建新的
  • ReplicaSet:新版k8s中,replicaSet取代ReplicationController,本质没有不同,replicaSet支持集合式selector
  • Deployment:一般建议使用deployment管理replicaSet,这样无需担心跟其他机制不兼容问题(repicaSet不支持rolling-update,但deployment支持)

HPA(Horuzibtal Pod Autosacling)

在V1版本根据pod的cpu利用率扩容pod的数量,在vlalpha版本,支持根据内存和用户自定义的metric扩缩容

StatefulSet

是为了解决有状态服务的问题,对应的deployment和replicaSets是为了无状态服务而设计的,应用场景包括

  • 稳定的持久化存储,即pod重新调度后还是能访问到相同的持久化数据库,基于pvc实现
  • 稳定的网络标志,即pod重新调度后podName和HostName不变,基于Headless Service(即没有Cluster IP的service)实现
  • 有序部署,有序扩展,即pod是有顺序的,
  • 有序收缩,有序删除

DaemonSet

确保全部(或者一些)Node上运行一个pod的副本,随着Node的增加和删除,会同时新增和删除,用法

  • 运行日志收集,fluentd
  • 监控,

Job

Job负责批量执行任务,即仅执行一次的任务,他保证批量处理任务的一个或多个pod成功结束
Cron Job管理基于时间的Job即

  • 在给定时间点只运行一次
  • 周期性在给定时间点运行

服务发现

service

五:网络发现

  • 同一pod内的多个容器内部通讯:同一个pod共享同一个网络命名空间,共享同一个linux协议栈,使用localhost访问

  • 各pod之间的通信:Overlay Network

    * pod1与pod2不在同一台主机,overlay network网络,使用flannel
    * pod1与pod2在同一台机器,由Docker0网桥直接转发请求到pod2,不需要使用flannel
    
  • Pod与service之间的通讯:各节点的IPtables规则

  • Pod到外网,Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主机网卡完成路由选择后,iptables执行masquerade,把源IP更代为宿主机网卡的IP,然后向外网服务器发送请求

  • 外网访问Pod,service

Overlay Network扁平化网络

Flannel:是一个网络规划服务,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟Ip地址,而且它能够在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不同地传送到目标容器内
在这里插入图片描述
Etcd之Flannel提供说明

  • 存储管理Flannel可分配的IP地址段资源
  • 监控Etcd中每个Pod的实际地址,并在内存中建立维护pod节点路由表
    在这里插入图片描述

六:资源清单

* k8s中资源
* 资源清单
* 常用字段解释说明
* 容器生命周期

6.1 k8s中的资源

资源分类:
命名空间级别:kubeadm k8s
集群级别:role
元数据型:HPA。通过指标分类
资源的概念:K8S中所有的内容都抽象为资源,资源实例化之后,叫做对象

6.1.1 命名空间级别

在这里插入图片描述

6.1.2 集群级别资源

Namespace Node Role ClusterRole RoleBinding、ClusterRoleBing

6.1.3 元数据资源

HPA、PodTemplate、LinitRange

6.2 资源清单

在k8s中,一般使用yaml格式的文件

  • 不允许使用tab键,只允许使用空格
    键值类型
age: 18

数组类型

animal
- cat
- Dog

复合类型,对象和数组可以结合使用

languages:
- Ruby
-  Perl
websites:
YAML: yam,org

yaml文件中“~”代表空值

6.3 常见字段解释说明

6.3.1 必须存在的属性

在这里插入图片描述

6.3.2 主要对象,没有设置的话使用默认值

在这里插入图片描述

6.4容器生命周期

readiness:
Liveness:
在这里插入图片描述

  • InitC
    Pod能够具有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的Init容器
    Init容器于普通的容器非常像,除了如下两点
    • Init容器总是运行到成功完成为止
    • 每个Init容器都必须在下一个Init容器启动之前成功完成
      如果pod的init容器失败,k8s会不断地重启该pod,知道Init容器成功为止,然后,如果pod对应的restartPolicy为Never,则不会重启。
      在这里插入图片描述
      测试:1
      在这里插入图片描述
      在这里插入图片描述
      另外两个service,initC检测的service
      在这里插入图片描述

6.5 探针

探针是有kubelet对容器执行的定期诊断,要执行诊断,kubelet调用有容器实现的Handler,有三种类型的处理程序

  • ExecAction:在容器内执行制定命令,如果命令退出时返回码为0,则认为诊断成功
  • TCPSocketAction:对制定端口上的容器的IP地址进行TCP检查,如果端口打开,则诊断为成功
  • HTTPGetAction:对指定的端口和路径上的容器的IP地址执行HTTP执行Get请求,如果响应的非状态码大雨等于200且小于400,则成功
    每次探针都将获取以下三种结果之一
  • 成功,容器通过诊断
  • 失败,未通过诊断
  • 未知,诊断失败,因此不糊采取任何行动

6.5.1 探针方式

  • livennessProbe:指示容器是否正在运行,如果存活探针失败,则kubelet会杀死容器,并且容器将会受到其“重启策略”的影响,如果容器不提供存活探针,则默认状态为success
  • readinessProbe:只是容器是否准备好服务请求,如果就是探测失败,断点控制器将从Pod匹配的所有Service的断点中删除该Pod的IP地址,初始延迟之前的就绪状态默认为Failure,如果容器不提供就绪探针,则默认状态为Success

6.5.2测试

  • 就绪探针
    在这里插入图片描述
initialDelaySeconds:1       容器启动1s后开始检查
periodSeconds:3               每3秒检查一次

由于使用的是就绪探针,通过在myapp中没有index1.html文件,该pod的Status会是running,但Ready为非就绪
在这里插入图片描述
上述的pod的信息中,
READY:就绪探针检测后的值
STATUS:生存探针检测后的值

  • 生存探针 exec
    在这里插入图片描述
  • 生存探针 http

在这里插入图片描述

timeoutSeconds:10  每次请求的超时时间
  • 生存探针 tcp
    在这里插入图片描述

6.6 启动、退出动作

Pod的生命周期中,Pod在启动的时候执行postStart里面的指令,Pod在死亡时执行preStop里面的指令
在这里插入图片描述

6.7 Pod各个状态存在的可能值

  • Pending:挂起,Pod已被k8s系统接收,但有一个或多个容器镜像尚未创建,等待时间:包括调度pod的时间和通过网络下载镜像的时间,这可能需要花点时间
  • Running:运行中,该Pod已经绑定到了一个节点上,Pod中所有的容器都已被创建,至少有一个容器正在运行,或者正处于启动或重启状态
  • Succeeded:成功,pod中的所有容器都被成功终止,且不会重启
  • Failed:Pod中的所有的容器都已被终止,并且至少有一个容器是因为失败终止,也就是说,容器以非0状态退出或被系统终止
  • Unknown:未知,因为某些原因无法获取Pod的状态,通常是因为Pod所在主机通讯失败

7 控制器

Pod的分类:

  • 自主式Pod,Pod退出了,此类型的Pod不会被创建
  • 控制器管理的Pod,在控制器的生命周期里,始终要维持Pod的副本数目

7.1 什么是控制器

k8s中内建立了很多controller(控制器),这些相当于一个状态机,用来控制Pod的具体状态和行为

7.2 控制器类型

  • ReplicationController 和ReplicaSet
  • Deployment
  • DaemonSet
  • StateFulSet
  • Job/CronJob
  • Horizontal Pod Autoscalling

7.2.1 RC和RS

  • RC:用来确保容器应用的副本说始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代,而如果异常多出来的容器也会自动回收
  • RS:在新版k8s中建议使用RS取代RC,RS跟RC没有本质的不同,只是名字不一样,并且RS支持集合式的selector

7.2.2 Deployment

Deployment为pod和ReplicaSet提供一个声明式定义方法,用来替代以前的RC来方便的管理应用,典型的应用场景包括:

  • 定义Deployment来创建Pod和Replicaset,示意图如下
    在这里插入图片描述
  • 滚动升级和回滚应用,通过执行新增的RS,来实现;deployment特有
    在这里插入图片描述
  • 扩容和缩容
  • 暂停和继续Deployment

7.2.3 DaemonSet

在这里插入图片描述

7.2.4 Job

job负责批量处理任务,即仅执行一次任务,它保证批处理任务的一个或多个pod成功结束

7.2.5CronJob

在特定的时间循环创建Job,
CronJob管理基于时间的Job,

  • 在给定时间只运行一次,
  • 周期性地在给定时间点运行
    典型的用法
  • 在给定的时间点调度job运行
  • 创建周期性运行的job,例如数据库备份、发送邮件

7.2.6 statefulset有状态服务

在这里插入图片描述

7.2.7 HPA (Horizontal Pod Autoscaling)

应用的资源使用率通常都有高峰和低谷的时候,如何削峰削谷,提高集群整体资源利用率,让service中的Pod个数自动调整?这就是HPA的左右,可根据内存的占比使pod水平自动缩放

概念补充

命令式编程:它侧重于如果实现程序,需要把程序实现的过程按照逻辑结果一步步写下来
声明式编程:它侧重于定义要想什么,然后告诉计算机、引擎,让他去实现

7.3 各个控制器的使用

7.3.1 RS与RC与Deployment的关联

  • RC(ReplicationController)主要的作用就是用来确保容器应用的副本数始终保持在用户定义的副本数。即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收Kubernetes官方建议使用RS(ReplicaSet)替代RC(ReplicationController)进行部署,RS跟RC没有本质的不同,只是名字不一样,并且RS支持集合式的selector。
    在这里插入图片描述
  • RS和Deployment的关联
    在这里插入图片描述Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。
    典型的应用场景包括:
    定义Deployment来创建Pod和ReplicaSet
    滚动升级和回滚应用
    扩容和缩容
    暂停和继续Deployment
  • 案例
    在这里插入图片描述

创建deployment会同时创建RS
在这里插入图片描述

  • deployment 扩容
    kubectl scale deployment nginx-deployment --replicas10
  • 更新
    kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
  • 回滚
    kubectl rollout undo deployment/nginx-deployment
  • 查看回滚的状态
    kubectl rollout status deployments
  • 查看回滚历史
    kubectl rollout history deployment/
  • 可以使用 --version参数制定某个历史版本
    kubectl rollout undo deployment/ --to-revision=1
    在这里插入图片描述
  • kubectl rollout pause deployment/nginx-deployment ## 暂停deployment的更新
  • 使用kubectl rollout status 查看deployment滚动是否成功,如果成功返回值为0
    在这里插入图片描述
    在这里插入图片描述

7.3.2 DaemonSet

在这里插入图片描述

7.3.3 Job

在这里插入图片描述

7.3.4 CronJob

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8 Service (SVC)

8.1 Service的概念

k8s中定义了这样的一种抽象,一个Pod的逻辑分组,一种可以访问他们的策略----通过称为微服务,这一组Pod能够被service访问到,通常是通过 Label Selector选择
在这里插入图片描述
Service能够提供负载均衡的能力,但是在使用上有以下限制:
只提供4层负载均衡能力,而没有7层功能,但有时我们可能需要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的
Service在K8S中的四种类型

  • clusterIP:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
    在这里插入图片描述
  • NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过: NodePort来访问该服务
    在这里插入图片描述
  • LoadBalancer:在NodePort的基础上,借助cloud provider创建一个外部负载均衡器,并将请求转发到: NodePort
    主要是使用云供应商实现负载均衡

在这里插入图片描述

  • ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有kubernetes 1.7或更高版本的kube-dns才支持
    SVC的实现流程
    在这里插入图片描述

8.2 代理

VIP和Service代理
在这里插入图片描述

  • userspace代理
    在这里插入图片描述
  • iptables
    在这里插入图片描述
  • ipvs
    在这里插入图片描述

8.3 ClusterIP

clusterIP主要在每个node节点使用iptables,将发向clusterIP对应端口的数据,转发到kube-proxy中。然后kube-proxy自己内部实现有负载均衡的方法,并可以查询到这个service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口
在这里插入图片描述
为了实现图上的功能,主要需要以下几个组件的协同工作:

  • apiserver用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求后将数据存储到etcd中
  • kube-proxy kubernetes的每个节点中都有一个叫做kube-porxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables规则中
  • iptables使用NAT等技术将virtualIP的流量转至endpoint中
    在这里插入图片描述

8.3.1 测试

deployment.yaml
在这里插入图片描述
在这里插入图片描述

8.4 NodePort

nodePort的原理在于在node上开了一个端口,将向该端口的流量导入到kube-proxy,然后由kube-proxy进一步到给对应的pod.
会在每一个node节点都暴露端口
在这里插入图片描述

8.5 Ingress

域名访问,一般使用的是ingrass-nginx
在这里插入图片描述
在这里插入图片描述

8.5.1 IngressHTTPS 代理访问

创建证书,以及cert存储方式
在这里插入图片描述
在这里插入图片描述

8.5.2 Nginx进行BasicAuth

在这里插入图片描述

8.5.3 Nginx进行重写

在这里插入图片描述

9 ConfigMap

ConfigMap功能在Kubernetes1.2版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API给我们提供了向容器中注入配置信息的机制,ConfigMap可以被用来保存单个属性,也可以用来保存整个配置文件或者JSON二进制大对象.

  • 文件目录创建
    在这里插入图片描述
  • 使用文件创建
    只要指定为一个文件就可以从单个文件中创建ConfigMap
    kubectl create configmap game-config-2 --from-file=docs/guide/configmap/kubectl/game.properties
  • 使用字面值创建
    kubectl create configmap special-map --from-literal=name=www --from-literal=age=12

9.1 ConfigMap在Pod中的使用

在这里插入图片描述
创建pod

在这里插入图片描述

9.2 用ConfigMap设置命令行参数

在这里插入图片描述

10 Secret

Secret解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。
Secret可以以Volume或者环境变量的方式使用。
在这里插入图片描述

  • Service Account
    在这里插入图片描述
  • Opaque Secret
    创建说明
    Opaque类型的数据是一个map类型,要求value是base64编码格式:
    在这里插入图片描述
    secret.yaml
    在这里插入图片描述
    使用方式
    1、将Secret挂载到Volume中
    在这里插入图片描述
    在这里插入图片描述

2、将Secret导出到环境变量中
在这里插入图片描述
在这里插入图片描述
如果在镜像仓库中拉取镜像需要密码时,可以先创建docker registry认证的secret,然后再创建pod的yaml指定imagePullSecrets。达到不需要密码的效果
在这里插入图片描述

11 Volume

在这里插入图片描述

11.1emptyDir

emptyDir类型的volume在pod分配到node上时被创建,kubernetes会在node上自动分配 一个目录,因此无需指定宿主机node上对应的目录文件。这个目录的初始内容为空,当Pod从node上移除时,emptyDir中的数据会被永久删除。
容器崩溃不会从节点中移除pod,因此emptydir卷中的数据在容器崩溃时是安全的
临时存储,
在这里插入图片描述
在这里插入图片描述

#在master上编写emptyDir资源清单
[root@ubuntu-200 ~]# cat volume-emptyDir.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: emptydir-pod    #注意此处只能是小写字母或数字,大写字母会报错
spec:
  containers:
  - name: nginx-test
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

#创建pod
[root@ubuntu-200 ~]# kubectl apply -f volume-emptyDir.yaml

#查看Pod
[root@ubuntu-200 ~]# kubectl get pods -o wide
NAME                READY   STATUS             RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES
emptydir-pod        1/1     Running            0          17s     10.244.2.62   ubuntu-210   <none>           <none>

#进入容器并在容器中创建文件测试
[root@ubuntu-200 ~]# kubectl exec -it emptydir-pod -- bash
root@emptydir-pod:/# ls -l /cache/
total 0
root@emptydir-pod:/cache# touch /cache/nginx-emptydir.log
root@emptydir-pod:/cache# echo nginx-emptydir > /cache/nginx-emptydir.log 
root@emptydir-pod:/cache# cat /cache/nginx-emptydir.log 
nginx-emptydir

#在node节点上查找临时存储的文件位置
[root@ubuntu-210 ~]# find / -name nginx-emptydir.log
/var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log

#查看文件内容
[root@ubuntu-210 ~]# cat /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log
nginx-emptydir

#在master节点上删除pod
[root@ubuntu-200 ~]# kubectl delete -f volume-emptyDir.yaml 
pod "emptydir-pod" deleted

#在node节点上查看临时存储是否还存在
[root@ubuntu-210 ~]# cat /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log
cat: /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/nginx-emptydir.log: No such file or directory
[root@ubuntu-210 ~]# ll /var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/
ls: cannot access '/var/lib/kubelet/pods/95dcb0a8-61f7-42e3-aa35-e7f1a1872b20/volumes/kubernetes.io~empty-dir/cache-volume/': No such file or directory

11.2 hostPath

hostPath卷将主机节点的文件系统中的文件或目录挂载到集群中
hostPath的用途如下:

  • 运行需要访问Docker内部的容器;使用/var/lib/docker的hostPath
  • 在容器中运行cAdvisor;使用/dev/cgroups的hostPath
  • 允许pod指定给定的hostPath是否应该在pod运行之前存在,是否应该创建,以及它应该以什么形式存在
    在这里插入图片描述
    使用这种卷类型是请注意,因为:
  • 由于每个节点上的文件都不同,具有相同配置(例如从podTemplate创建的)的pod在不同节点上的行为可能会有所不同
  • 当Kubernetes按照计划添加资源感知调度时,将无法考虑hostPath使用的资源
  • 在底层主机上创建的文件或目录只能由root写入。您需要在特权容器中以root身份运行进程,或修改主机上的文件权限以便写入hostPath卷
    在这里插入图片描述

12 PV

在这里插入图片描述
pod消失,pv不会因为pod删除而删除,pvc消耗pv资源
在这里插入图片描述

12.1 PV访问模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值