Kubernetes学习笔记

简介

Kubernetes 是 Google 团队发起并维护的开源容器集群管理系统。基于容器技术实现资源的自动化管理。
kubernetes不仅支持Docker还差支持Rocket等其他容器运行时。
kubernetes的核心概念是pod。一个pod由一组工作于同一个物理工作节点的容器构成。这些组容器拥有相同的网络命名空间、IP以及存储配额。此外,kubernetes的Node工作节点会由Master节点进行管理,每个节点都包含了能够运行Docker容器所用到的服务。

相关服务组件

主节点Master服务

  • apiserver 是整个系统的对外接口,提供 RESTful 方式供客户端和其它组件调用;
  • scheduler 负责对资源进行调度,分配某个 pod 到某个节点上;
  • controller-manager 负责管理控制器,包括 endpoint-controller(刷新服务和 pod 的关联信息)和 replication-controller(维护某个 pod 的复制为配置的数值)。

工作节点Node服务

  • kubelet 是工作节点执行操作的 agent,负责具体的容器生命周期管理,根据从数据库中获取的信息来管理容器,并上报 pod 运行状态等;
  • kube-proxy 为 pod 上的服务提供访问的代理。

其他服务

  • Etcd 是所有状态的存储数据库,是一个分布式键值对存储系统。

基本概念

  • 节点( Node ):一个节点是一个运行 Kubernetes 中的主机。
  • 容器组( Pod ):一个 Pod 对应于由若干容器组成的一个容器组,同个组内的容器共享一个存储卷(volume)。
  • 容器组生命周期( pos-states ):包含所有容器状态集合,包括容器组状态类型,容器组生命周期,事件,重启策略,以及 replication controllers。
  • Replication Controllers:主要负责指定数量的 pod 在同一时间一起运行。
  • 服务( services ):一个 Kubernetes 服务是容器组逻辑的高级抽象,同时也对外提供访问容器组的策略。
  • 卷( volumes ):一个卷就是一个目录,容器对其有访问权限。
  • 标签( labels ):标签是用来连接一组对象的,比如容器组。标签可以被用来组织和选择子对象。
  • 接口权限( accessing_the_api ):端口,IP 地址和代理的防火墙规则。
  • web 界面( ui ):用户可以通过 web 界面操作 Kubernetes。
  • 命令行操作( cli ): kubecfg 命令。

kubectl常见命令使用

  • get: 显示一个或多个资源
  • describe: 显示资源详情
  • create: 从文件或标准输入创建资源
  • update: 从文件或标准输入更新资源
  • delete: 通过文件名、标准输入、资源名或者label selector删除- 资源
  • log: 输出pod中一个容器的日志
  • rolling-update: 对指定的replication controller执行滚动升- 级
  • exec: 在容器内部执行命令
  • port-forward: 将本地端口转发到Pod
  • proxy: 为Kubernetes API server启动代理服务器
  • run: 在集群中使用指定镜像启动容器
  • expose: 将 replication controller service 或 pod 暴露为新- 的 kubernetes service
  • label: 更新资源的label
  • config: 修改 kubernetes 配置文件
  • cluster-info: 显示集群信息
  • api-versions: 以 "组/版本" 的格式输出服务端支持的 API 版本
  • version: 输出服务端和客户端的版本信息
  • help: 显示各个命令的帮助信息
  • replace: 对已有资源进行更新、替换
  • patch: 在容器运行时,直接对容器进行修改
  • scale: 用于程序在负载加重或缩小时副本进行扩容或缩小

相关yaml格式

  • pod(deployment方式)
apiVersion: apps/v1    #指定api版本,此值必须在kubectl apiversion中  
kind: Deployment       #指定创建资源的角色/类型  
metadata:              #资源的元数据/属性  
  name: nginx-pod      #资源的名字,在同一个namespace中必须唯一  
  labels:              #设定资源的标签,详情请见http://blog.csdn.net/liyingke112/article/details/77482384
    k8s-app: apache  
    version: v1  
    kubernetes.io/cluster-service: "true"  
  annotations:             #自定义注解列表  
    - name: String         #自定义注解名字  
spec:                      #specification of the resource content 指定该资源的内容  
  selector:
    matchLabels:
      app: nginx-pod
  replicas: 1              #运行一个实例
  restartPolicy: Always    #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器  
  nodeSelector:            #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1  
    zone: node1  
  template:
    metadata:
      labels:
        app: node-server
        enabled: "true"
    spec:
      containers:  
      - name: nginx-pod        #容器的名字  
        image: nginx:latest    #容器使用的镜像地址  
        imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
                               #Always,每次都检查
                               #Never,每次都不检查(不管本地是否有)
                               #IfNotPresent,如果本地有就不检查,如果没有就拉取
        command: ['sh']        #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT  
        args: ["$(str)"]       #启动容器的命令参数,对应Dockerfile中CMD参数  
        env:                   #指定容器中的环境变量  
        - name: str            #变量的名字  
          value: "/etc/run.sh" #变量的值  
        resources:             #资源管理,请求请见http://blog.csdn.net/liyingke112/article/details/77452630
          requests:            #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行  
            cpu: 0.1           #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
            memory: 32Mi       #内存使用量  
          limits:              #资源限制  
            cpu: 0.5  
            memory: 32Mi  
        ports:  
        - containerPort: 80    #容器开发对外的端口
          name: httpd          #名称
          protocol: TCP  
        livenessProbe:         #pod内容器健康检查的设置,详情请见http://blog.csdn.net/liyingke112/article/details/77531584
          httpGet:             #通过httpget检查健康,返回200-399之间,则认为容器正常  
            path: /            #URI地址  
            port: 80  
            #host: 127.0.0.1    #主机地址  
            scheme: HTTP  
          initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始  
          timeoutSeconds: 5        #检测的超时时间  
          periodSeconds: 15        #检查间隔时间  
          #也可以用这种方法  
          #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常  
          #  command:  
          #    - cat  
          #    - /tmp/health  
          #也可以用这种方法  
          #tcpSocket: //通过tcpSocket检查健康   
          #  port: number   
        lifecycle:         #生命周期管理  
          postStart:       #容器运行之前运行的任务  
            exec:  
              command:  
                - 'sh'  
                - 'yum upgrade -y'  
          preStop:         #容器关闭之前运行的任务  
            exec:  
              command: ['service httpd stop']  
        volumeMounts:      #详情请见http://blog.csdn.net/liyingke112/article/details/76577520
        - name: volume     #挂载设备的名字,与volumes[*].name 需要对应    
          mountPath: /data #挂载到容器的某个路径下  
          readOnly: True  
      volumes:             #定义一组挂载设备  
      - name: volume       #定义一个挂载设备的名字  
        #meptyDir: {}  
        hostPath:  
          path: /opt       #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种  
  • service
apiVersion: v1
kind: Service
metadata:
 name: nginx-service
spec:
 type: NodePort         #有配置NodePort,外部流量可访问k8s中的服务
 ports:
 - port: 30080          #服务访问端口
   targetPort: 80       #容器端口
   nodePort: 30001      #NodePort集群外访问端口
 selector:
   name: nginx-pod
  • deployment(简洁版)
apiVersion: extensions/v1beta1   #当前格式的版本
kind: Deployment                 #当前创建资源的类型, 当前类型是Deployment
metadata:                        #当前资源的元数据
  name: nginx-test               #当前资源的名字 是元数据必须的项
spec:                            #是当前Deployment的规格说明
  replicas:                      #指当前创建的副本数量 默认不填 默认值就为‘1’
  template:                      #定义pod的模板
    metadata:                    #当前pod的元数据
      labels:                    #至少顶一个labels标签,可任意创建一个 key:value
        app: web_server
    spec:                        #当前pod的规格说明
      containers:                #容器
      - name: nginx              #是容器的名字容器名字是必须填写的
        image: nginx:latest      #镜像 镜像的名字和版本
  • deamonset
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: k8s.gcr.io/fluentd-elasticsearch:1.20
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
posted @ 2019-03-06 10:59  wongds  阅读(87)  评论(0)    收藏  举报