k8s权威指南-概念和术语

概念 kubernetes是个高度自动化的资源控制系统。跟踪对比etcd库里保存的资源期望状态与当前环境中实际资源状态差异来实现自动控制和自动纠错的高级功能。
Master Node

kubectl get pods kubectl describe node 127.0.0.1

Pod 对应一组容器。
pod出现原因
  • 解决业务容器是否有效,通过业务无关且不容易死亡的Pause容器作为根容器(一个容器死亡算整体死亡吗?)
  • 解决多个业务容器共享Pause容器的IP,简化业务容器直接通信问题
资源限制
spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 resources: requests:# 资源的最小申请量 memory: "64Mi"# 单位是内存字节数 cpu: "250m"# 千分之一的最小配额。即0.25个cpu limits:# 资源最大允许使用量 memory: "128Mi" cpu: "500m"# 0.5个cpu ports: - containerPort: 8080

  • Replication Controller
    Replication Set区别:RS基于支持集合的selector
    实现应用集群的高可用性。根据selector确保某个标签的pod数量符合预期值。
    • RC设置pod的副本数,实现pod的扩容或缩容
    • RC设置pod的镜像版本,实现pod的滚动升级
    kubectl scale rc myweb --replicas=3# 动态缩放pod的数量

  • Deployment
    内部使用Replication Set
    tomcat-depolyment.yaml文件
    apiVersion: extensions/v1beta1 kind: Deployment metadata: name: frontend spec: replicas: 1 selector: matchLabels:# 基于集合的标签匹配 tier: frontend matchExpressions: - { key: tier, operator: In, values: [frontend]} template: metadata: labels: app: app-demo tier: frontend spec: containers: - name: tomcat-demo image: tomcat imagePullPolicy: IfNotPresent ports: - containerPort: 8080

    查看Deployment信息
    # kubectl get deployments动态看到pod水平扩展过程 NAMEDESIRED(期望)CURRENT(当前)UP-TO-DATE(滚动成功)AVAILABLEAGE frontend11103m# kubectl get rs NAMEDESIREDCURRENTREADYAGE frontend-1414772171103m

  • Horizontal Pod Autoscaler
    水平自动伸缩pod谷歌大神觉得分布系统要能够根据当前负载变化情况自动触发水平扩展或缩容行为。
    HPA衡量pod的指标:CPUUtilzationPercentage;应用程序自定义的度量指标,如服务的TPSQPS
    cpu利用率:pod自身的是当前cpu的使用量除以request
    CPUUtilzationPercentage:1分钟内podcpu使用量的平均值
    HPA定义horizontal-pod-autoscaler.yml文件
    apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: frontend namespace: default spec: maxReplicas: 10 minReplicas: 1 scaleTargetRef:# HPA控制的目标对象名为frontend的Deployment的所有pod实例 kind: Deployment name: php-apache targetCPUUtilizationPercentage: 90 # 当Pod的副本cpu超过90%时介于1~10间扩容缩容

    命令 kubectl autoscale deployment frontend --cpu-percent=90 --min=1 --max=10
  • StatefulSet
    kubernetspod管理对象RC、Deployment、DaemonSet、Job都是面向无状态服务。但MySQL、MongoDB等是有状态。
    无状态时可以自由重启,随机分配。有状态则被限制。
    • StatefulSet每个pod都有稳定的网络标识
    • 采用稳定的持久化存储卷
    • 启停顺序受控制
    • 每个pod有对应的DNS解析
Service kubernetesservice对应服务架构的一个微服务,由一组Pod副本组成的集群实例。
servicepod的关联通过Label Selector来实现无缝对接。
RC保证Service的服务能力和服务质量处于预期。
kubectl get endpoints# 查看服务对应的pod实例信息 kubectl get svc myweb -o yaml# 查看服务的详细信息

  • 一个服务多端口
    给每个端口命名,用于kubernetes服务发现机制。
    myweb-svc.yml文件
    apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 name: service-port - port: 8085 name: shutdown-port selector: app: myweb

  • kubernetes的服务发现机制
    一般分布式系统提供特定API接口实现服务发现的功能,平台入侵性强。
    kubernetes通过Add-on增值包的方式引入DNS系统,把服务名作为DNS域名,程序与服务直接建立通信
三类IP地址
  • Node IP:集群中Node节点的物理网卡IP,真实物理网络
  • Pod IPDocker Engine网桥分配的IP地址,虚拟二层网络
  • Cluster IP:伪造的虚拟IP,无法ping,须结合service port结合
问:外部怎么访问kubernetes集群内部?
答:采用NodePort解决。
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort# 注意 ports: - port: 8080 nodePort: 30001# NodeIP+NodePort访问 selector: app: myweb

Volume pod中能被多个容器访问的共享目录。
  • k8svolume定义在pod上,一个pod的多个容器挂载到具体目录
  • k8svolume生命周期与pod相同,但与容器生命周期无关
  • k8s支持多种类型的volume,如CephGlusterFs
    • emptyDir:宿主机无对应目录,kubernetes自动分配。用于临时目录
    • hostPath:挂载宿主机上。用于应用程序的日志文件,永久保存的
使用
Pod声明Volume ———> 在容器里引用Volume并挂载到某个目录
apiVersion: v1 kind: ReplicationController metadata: name: mysql spec: replicas: 1 selector: app: mysql template: metadata: labels: app: mysql spec: volumes:# 定义pod的volume的名字及类型 - name: datavol emptyDir: {}# empty #volumes: #- name: persistent-storgae #hostPath:# hostPath #path: "/data" containers: - name: mysql image: mysql:5.6 volumeMounts: - mountPath: /data name: datavol# 根据pod的volume名挂载到容器内/data目录 ports: - containerPort: 3306

Persistent Volume(PV) 网络存储是一种实体资源,独立于计算资源(CPU、内存),故与pod独立。
  • PV只是网络存储,不属于任何Node,每个Node可访问
  • PV独立于Pod定义
  • PV支持类型:NFS、RDB、HostPath(供单机测试)
状态:Available(可用)、Bound(已绑定到pvc)、Released(pvc已删除未回收)、Failed(pv回收失败)
使用
定义NFS类型的PV
apiVersion: v1 kind: PersistentVolume# pv metadata: name: pv001 spec: capacity: storage: 5Gi# 5Gi的存储空间 accessModes: - ReadWriteOnce# 读写权限,只能被单个Node挂载。 ReadOnlyMany、ReadWriteMany nfs: path: /data server: 172.17.0.2

pod要用pv,需要先定义一个pvc
apiVersion: v1 kind: PersistentVolumeClaim# pvc metadata: name: myclaim spec: accessModes: - ReadWriteOnce resources: requests: storage: 3Gi server: 172.17.0.2

podvolume中用pvc
volumes: - name: mypd persistentVolumeCalim: claimName: myclaim

Namespace Namespace是实现多租户的资源隔离,将集群内部资源对象分配到不同的Namespace中,实现资源共享与管理。
kubernetes集群默认创建defaultnamespace
# kubectl get namespaces NAMESTATUSAGE defaultActive4d kube-systemActive4d

使用
  • 创建namespace
    # cat new-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: development# kubectl create -f new-namespace.yaml

  • 资源对象使用namespace
    # cat ns-pod.yml apiVersion: v1 kind: Pod metadata: name: busybox namespace: development spec: containers: - image: busybox command: - sleep - "3600" name: busybox# kubectl create -f ns-pod.yml

  • 查看
    kubectl get pods# 默认查看default的命名空间的资源对象 kubectl get pods --namespace=development# 指定查看

Annotation 【k8s权威指南-概念和术语】灵活的k/v,用户自定义,便于查找与标记。

    推荐阅读