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水平扩展过程
    NAME       DESIRED(期望)   CURRENT(当前)   UP-TO-DATE(滚动成功)   AVAILABLE   AGE
    frontend   1                 1                1                       0           3m
    
    # kubectl get rs      
    NAME                 DESIRED   CURRENT   READY     AGE
    frontend-141477217   1         1         0         3m
    
  • 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
NAME          STATUS    AGE
default       Active    4d
kube-system   Active    4d

使用

  • 创建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

灵活的k/v,用户自定义,便于查找与标记。

你可能感兴趣的:(k8s权威指南-概念和术语)