Kubernetes存储卷

在Kubernetes之上,在节点级提供一个存储卷的方式来持久存储数据的逻辑,这种只具备一定程度上的持久性。为了实现更强大的持久性,应该使用脱离节点而存在的共享存储设备。 为此Kubernetes提供了不同类型的存储卷。 大多数和数据存储服务相关的应用,和有状态应用几乎都是需要持久存储数据的。容器本身是有生命周期的,为了使容器终结后可以将其删除,或者编排至其他节点上去运行。意味着数据不能存储在容器本地。一旦Pod故障就会触发重构。如果将数据放置在Pod自有的容器内名称空间中,数据随着Pod终结而结束。为了突破Pod生命周期的限制,需要将数据放置在Pod自有文件系统之外的地方。 存储卷 对Kubernetes来讲,存储卷不属于容器,而属于Pod。因此,在Kubernetes中同一个Pod内的多个容器可共享访问同一组存储卷。 Pod底部有一个基础容器, ==pause==,但是不会启动。pause是基础架构容器。创建Pod时pause时Pod的根,所有Pod,包括网络命名空间等分配都是分配给pause的。在Pod中运行的容器是pause的网络名称空间的。容器在挂载存储卷时,实际上是复制pause的存储卷。 因此为了真的实现持久性,存储卷应为宿主机挂载的外部存储设备的存储卷。如果需要实现跨节点持久,一般而言需要使用脱离节点本地的网络存储设备(ceph、glusterfs、nfs)来实现。节点如果需要使用此种存储的话,需要可以驱动相应存储设备才可以(在节点级可以访问相应网络存储设备)。 k8s之上可使用的存储卷 Kubernetes支持的存储卷类型 empryDir:只在节点本地使用的,用于做临时目录,或当缓存使用。一旦Pod删除,存储卷一并被删除。empryDir背后关联的宿主机目录可以使宿主机的内存。 hostPath:使宿主机目录与容器建立关联关系。 网络存储 传统的SAN(iSCSI,FC)NAS(常见用法协议 NFS,cifs,http)设备所构建的网络存储设备。 分布式存储(分机系统或块级别),glusterfs,ceph(rbd ceph的块接口存储),cephfs等。 云存储:EBS(弹性块存储)亚马逊 ,Azure Disk 微软。此模型只适用于Kubernetes集群托管在其公有云之上的场景。 使用kubectl explain pod.spec.volumes查看Kubernetes所支持的存储类型。 emptyDir 语法 emptyDir medium 媒介类型 empty string (disk 默认) or memory sizeLimit 空间上限 定义完存储卷之后,需要在container当中使用volumeMounts指明挂载哪个或哪些个存储卷 yaml 1 2 3 4 5 - container - mountPath 挂载路径 - name 挂载那个卷 - readOnly 是否只读挂载 - subPath 是否挂载子路径之下 yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 apiVersion: v1 kind: Pod metadata: name: my-nginx namespace: default spec: containers: - name: busybox image: busybox imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 command: ["tail"] volumeMounts: # 指明挂载哪一个存储卷 - name: html mountPath: /data/web/html # 指明挂载到容器的哪个路径下 volumes: - name: html emptyDir: {} # 表示空映射,都使用默认值,大小不限制,使用磁盘空间,而不是不定义 在Kubernetes中 $()是变量引用...

 ·  · 

kubernetes概念 - configMap

secret、configMap特殊类型的存储卷,多数情况下不是为Pod提供存储空间来用的,而是给管理员或用户提供了从集群外部向Pod内部应用注入配置信息的方式。 工作实现 configMap 在集群内部存在一个名称空间,在名称空间当中拥有一个可正常运行的Pod,当镜像启动时使用的配置文件在做镜像之前就确定了,并且做完镜像就不能修改了。除非在做镜像时使用entryPoint脚本去接受用户启动容器时传入环境变量进来,将环境变量的数据替换到配置文件中去,从而使应用程序在启动之前就能获得一个新的配置文件而后得到新的配置。当需要修改配置文件时是很麻烦的。而配置中心只需将集中的配置文件修改,并通知给相应进程,让其重载配置文件。而Kubernetes的应用也存在此类问题,当配置文件修改后就需要更新整个镜像。因此无需将配置信息写死在镜像中。而是引入一个新的资源,这个资源甚至是整个Kubernetes集群上的一等公民(标准的K8S资源)。这个资源被叫做configMap configMap当中存放的配置信息,随后启动每一个Pod时,Pod可以共享使用同一个configMap资源,这个资源对象可以当存储卷来使用,也可以从中基于环境变量方式从中获取到一些数据传递给环境变量,注入到容器中去使用。 因此configMap扮演了Kubernetes中的配置中心的功能。但是configMap是明文存储数据的。因此和configMap拥有同样功能的标准资源secret就诞生了。与configMap所不同之处在于,secret中存放的数据是用过编码机制进行存放的。 核心作用:让配置信息从镜像中解耦,从而增强应用的可移植性与复用性。使一个镜像文件可以为应用程序运行不同配置的环境而工作。简单来讲,一个configMap就是一系列配置数据的集合。这些数据可以注入到Pod对象中的容器所使用。 在configMap中,所有的配置信息都保存为key value格式。V只是代表了一段配置信息,可能是一个配置参数,或整个配置文件信息都是没有问题的。 配置容器化应用的方式 自定义命令行参数 args [] 把配置文件直接陪进镜像; 环境变量 Cloud Native的应用程序一般可直接通过环境变量加载配置 通过entrypoint脚本来预处理变量为配置文件中的配置信息。 存储卷 配置文件注入方式: 将configMap做存储卷 使用env docker config contioners env name 变量名 value 变量值 valueFrom 数据不是一个字符串,而是引用另外一个对象将其传递给这个变量。 configMapKeyRef configMap中的某个键 fieldRef 某个字段。此资源可以是Pod自身的字段。如metadata.labels status.hostIP status.podIP resourceFieldRef 资源需求和资源限制。 secreKeyRef 引用secre configMap无需复杂描述,因此没有spec字段 text 1 2 3 4 apiVersion kind data binaryData 一般情况下data与binaryData只使用其中一种。 创建简单的configMap还可以使用 kubectl create configMap来创建。如需要长期使用,可以定义为配置清单文件。 text 1 2 3 kubectl create configmap nginx-config \ --from-literal=nginx_port=80 \ --from-literal=servername=test.com 使用文件创建...

 ·  · 

kubernetes概念 - Dashboard

基于web的UI前端,认证是由Kubernetes完成的。登陆dashboard的密码是k8s的账号和密码,和dashboard自身没有关系。dashboard自身不做认证。 text 1 kubectl patch svc kubernetes-dashboard -p'{"spec":{"type":"NodePort"}}'-n kube-system 如使用域名访问,CN一定要与域名保持一致。 text 1 2 3 4 (umask 077; openssl genrsa -out dashboard.key 2048) openssl req -new -key dashboard.key -out dashboard.csr -subj "/O=test/CN=dashboard" openssl req -in dashboard.csr -noout -text openssl x509 -req -in dashboard.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out dashboard.crt -days 3650 Certificate Attributes 要想穿透集群边界,从集群外访问集群内部某一服务或Pod上的容器的应用,有两种方式 nodePort、NodeBlanc 或ingress text 1 2 3 4 5 kubectl create secret generic \ dashboard-cert \ -n kube-system \ --from-file=dashboard....

 ·  · 

kubernetes概念 - ingress

IngressController比较独特,它与DaemonSet、Deployment、Repliacaset不同,DaemonSet、Deployment等控制器是作为ControllerManager的子组件存在的。Ingress Controller是独立运行的一组Pod资源,通常是拥有七层代理、调度能力的应用程序。 通常在使用IngressController时有三种选择Nginx、Traefik、Envoy。 IngressController nginx运行在Pod中,其配置文件是在Pod中。后端代理的Pod随时会发生变动,IngressController需要watch API当中的后端Pod资源的改变。IngressController自身无法识别目前符合自己关联的(条件的)被代理的Pod资源有哪些,IngressController需借助service来实现。 因此要想定义一个对应的调度功能,还需要创建service,此service通过label selector关联至每一个upstream服务器组,通过此service资源关联至后端的Pod。此service不会被当做被代理时的中间节点,它仅仅是为Pod做分类的。此service关联的Pod,就将其写入upstream中。 在Kubernetes中有一种特殊资源叫做Ingress,当Pod发生改变时,其servcie对应的资源也会发生改变, 依赖于IngressResource将变化结果反应至配置文件中。 Ingress定义期望IngressController如何创建前段代理资源(虚拟主机、Url路由映射),同时定义后端池(upstream)。upstream中的列表数量,是通过service获得。 Ingress可以通过编辑注入到IngressController中,并保存为配置文件,且Ingress发现service选定的后端Pod资源发生改变,此改变会及时反映至Ingress中,Ingress将其注入到前端调度器Pod中,并触发Pod中的container主进程(nginx)重载配置文件。 要想使用Ingress功能,需要有service对某些后端资源进行分类,而后Ingress通过分类识别出Pod的数量和IP地址信息,并将反映结果生成配置信息注入到upstream中。 IngressController根据自身需求方式来定义前端,而后根据servcie收集到的后端Pod IP定义成upstream server,将这些信息反映在Ingress server当中,由Ingress动态注入到IngressController当中。 Ingress也是标准的Kubernetes资源,定义Ingress时同样类似于Pod方式来定义。使用kubectl explain Ingress查看帮助。 spec rules 规则,对象列表 host 主机调度 虚拟主机而非url映射 http paths 路径调度 backend path backend 定义被调度的后端主机,靠service定义,找到后端相关联的Pod资源。 serviceName 后端servcie名称,即用来关联Pod资源的service。 servicePort IngressController部署 namespace.yaml 创建名称空间 configmap.yaml 为nginx从外部注入配置的 rbac.yaml 定义集群角色、授权。必要时让IngressController拥有访问他本身到达不了的名称空间的权限 ingress.yaml yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-myapp namespace: defualt # 与deployment和要发布的service处在同一名称空间内 annotations: kubernetes....

 ·  · 

kubernetes概念 - Kubenetes Deployment

Deployment当中借助于ReplicaSet进行更新的策略反映在Deployment的对象定义所需字段可使用kubectl explain deploy,Deployment属于extension群组。在1.10版本中它被移至到apps群组。他与ReplicaSet相比增加了几个字段。 stratgy 重要字段,定义更新策略,它支持两种策略 重建式更新 Recreate与滚动更新RollingUpdate,如果type为RollingUpdate,那么RollingUpdate的策略还可以使用RollingUpdate来定义,如果type为Recreate,那么RollingUpdate字段无效。 默认值为RollingUpdate stratgy.RollingUpdate控制RollingUpdate更新力度 maxSurge 对应的更新过程当中,最多能超出目标副本数几个。有两种取值方式,为直接指定数量和百分比。在使用百分比时,在计算数据时如果不足1会补位1个。 maxUnavailable 最多有几个副本不可用。 revisionHistoryLimit 滚动更新后,在历史当中最多保留几个历史版本,默认10。 在使用Deployment创建Pod时,Deployment会自动创建ReplicaSet,而且Deployment名称是使用Pod模板的hash值,此值是固定的。 Deployment在实现更新应用时,可以通过编辑配置文件来实现,使用kubectl apply -f更改每次变化。每次的变化通过吧变化同步至apiserver中,apiserver发现其状态与etcd不同,从而改变etcd值来实现修改其期望状态,来实现现有状态去逼近期望状态。 kubectl explain deploy yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 apiVersion: apps/v1 kind: Deployment metadata: name: app-deploy namespace: default spec: replicas: 2 selector: matchLabels: app: deploy release: canary template: metadata: labels: app: deploy release: canary spec: containers: - name: my-deploy image: node01:5000/busybox:v1 ports: - name: http containerPort: 80 command: ["/bin/sh","-c","/bin/httpd -f -h /tmp"] 使用kubectl apply 声明式更新、创建资源对象。...

 ·  ·