Skip to content

Kubernetes Learning Doc

ash i am edited this page Apr 28, 2019 · 1 revision

Kubernetes

[TOC]

Kubernetes 的抽象性允许您将容器化的应用程序部署到集群,而不必专门将其绑定到单个计算机。Kubernetes 用于自动部署,扩展和管理容器化应用程序的开源系统。确保容器化的应用程序在您想要的时间和地点运行,并帮助应用程序找到它们需要的资源和工具。

集群是一组节点,这些节点可以是物理服务器或者虚拟机

  • 自动化容器的部署和复制

  • 随时扩展或收缩容器规模

  • 将容器组织成组,并且提供容器间的负载均衡

  • 很容易地升级应用程序容器的新版本

  • 提供容器弹性,如果容器失效就替换它

概念

Node

运行 Kubernetes 中的主机。作为Kubernetes worker,通常称为Minion。每个集群的非 master 节点运行两个进程:

  • Kubelet:是主节点代理。kubelet 是工作节点执行操作的 agent,负责具体的容器生命周期管理,根据从数据库中获取的信息来管理容器,并上报 pod 运行状态等
  • Kube-proxy:Service使用其将链接路由到Pod,如上文所述。
  • Docker或Rocket:Kubernetes使用的容器技术来创建容器。
  • proxy 为 pod 上的服务提供访问的代理

每个Node都包括以下状态信息

  • 地址:包括hostname、外网IP和内网IP
  • 条件(Condition):包括OutOfDisk、Ready、MemoryPressure和DiskPressure
  • 容量(Capacity):Node上的可用资源,包括CPU、内存和Pod总数
  • 基本信息(Info):包括内核版本、容器引擎版本、OS类型等
Pod

这是 Kubernetes 最小、最简单的可用来创建和部署的单元。Pod 是一个 Kubernetes 的资源抽象,表示一个或多个应用容器 (例如 Docker 或 rkt) 组,以及一些用于这些容器的共享资源。

安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。

Namespace

Kubernetes可以使用Namespaces(命名空间)创建多个虚拟集群。大多数Kubernetes资源(例如pod、services、replication controllers或其他)都在某些Namespace中

Replication Controller(RC)

保证Pod高可用的API对象,控运行中的Pod来保证集群中运行指定数目的Pod副本。

Replica Set(RS)副本集

本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。

Deployment部署

用户对K8s集群的一次更新操作。创建一个新的服务、更新一个新的服务,、滚动升级一个服务。

Lable

一个Label是attach到Pod的一对键/值对,用来传递用户定义的属性。

Replication Controller

Replication Controller确保任意时间都有指定数量的Pod“副本”。需要指定Pod和Label

Service

一个 Kubernetes 服务是容器组逻辑的高级抽象,同时也对外提供 访问容器组的策略。

一个 Pod 的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。 这一组Po能够被 Service 访问到。

在 Kubernetes 中是一个 REST 对象, 定义可以基于 POST 方式,请求 apiserver 创建新的实例。

每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。在K8s集群中微服务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。

Kubernetes Master

Kubernetes Master提供集群的独特视角,并且拥有一系列组件,比如Kubernetes API Server。由集群中单个节点上运行的三个进程组成的,该节点被指定为 master 节点。这些进程包括:

kube-apiserver :是整个系统的对外接口,提供 RESTful 方式供客户端和其它组件调用;。Kubernetes API server 为 api 对象验证并配置数据,包括 pods、 services、 replicationcontrollers和其它 api 对象。API Server 提供 REST 操作和到集群共享状态的前端,所有其他组件通过它进行交互

kube-controller-manager :负责管理控制器,包括 endpoint-controller(刷新服务和 pod 的关 联信息)和 replication-controller(维护某个 pod 的复制为配置的数值)。管理控制器负责整个Kubernetes的管理工作,保证集群中各种资源的状态处于期望状态,当监控到集群中某个资源状态不正常时,管理控制器会触发对应的调度操作

kube-scheduler:scheduler需要考虑独立的和集体的资源需求、服务质量需求、硬件/软件/策略限制、亲和与反亲和规范、数据位置、内部负载接口、截止时间等等。如有必要,特定的负载需求可以通过API暴露出来

此之外的组件:

etcd:etcd是一款用于共享配置和服务发现的高效KV存储系统,具有分布式、强一致性等特点。在Kubernetes环境中主要用于存储所有需要持久化的数据。Kubernetes 依赖 Etcd 服务来维护所有主节点的状态。所有状态的存储数据库

API服务器:对外暴露了Kubernetes API。它是的 Kubernetes 前端控制层

cluster DNS :是一个必须的 DNS 服务器

Install Minikube

环境:win10

  • 启动CPU的虚拟化功能

  • 下载Docker,win10有专门的 Win10 专业版系统的安装包,需要开启Hyper-V。

    {
      "registry-mirrors": ["配置加速器地址"]
    }
    
  • 在windows管理工具找到Hyper-V创建虚拟机(外界网络选可联网的,一般默认)

  • 安装kubectl:官网教程,下载失败可找资源,要把kubectl.exe目录加入环境变量

  • 安装Minikube:从Google网站下载可执行文件,然后改名为minikube.exe并添加路径到环境变量。、

  • minikube start时要注意:

    • .\minikube.exe start --registry-mirror=https://registry.docker-cn.com --vm-driver="hyperv" --memory=4096 --hyperv-virtual-switch="Hyper-V创建的虚拟机名字"
      

      不用VirtualBox的时候设置hyperv一定要有


 minikube status           # 查看 minikube 当前运行状态
 
 minikube docker-env       # 查看 Minikube 的 Docker 相关信息
 
 minikube delete
  
 minikube stop             #停止已运行的 Minikube 实例
  
 minikube dashboard        #打开Kubernetes控制台

kubectl使用

命令
kubectl get nodes       # 显示本地节点

kubectl get all               # 展示所有资源,包括 Pod, Service, Deployment, RS 等。

kubectl get all -o wide       # 展示更多的信息,包括镜像地址等

kubectl get po                          # 查看目前所有的pod

kubectl get rs                          # 查看目前所有的replica set

kubectl get deployment                  # 查看目前所有的deployment

kubectl describe po podname  	         # 查看pod的详细状态

kubectl describe rs podname            # 查看replica set的详细状态

kubectl describe deployment podname    # 查看deployment的详细状态
YAML语法规则

YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便。它实质上是一种通用的数据串行化格式。后文会说明定义YAML文件创建Pod和创建Deployment。

大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tal键,只允许使用空格 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

#表示注释,从这个字符一直到行尾,都会被解析器忽略

yaml Create pod
apiVersion: v1
kind: Pod  
metadata:  
  name: pod-redis
  labels:
    name: redis
spec: 
  restartPolicy: Always		#该容器一直运行,默认k8s的策略,在容器退出后,会立即创建一个相同的容器
  nodeSelector:  
    zone: node1			    #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1
  containers:
  - name: pod-redis
    image: docker.io/redis  
    imagePullPolicy: Never	#三个选择Always、Never、IfNotPresent,
                            #每次启动时检查和更新(registery)images的策略
    ports:
    - containerPort: 6379	#容器开发对外的端口
      hostPort: 8080       	#映射到主机的端口/对外映射的端口(一般可以不写)

kubectl create -f pod-redis.yaml kubectl get pod

yaml Create Service
apiVersion: v1  
kind: Service  
metadata:  
  name: kube-system  
  labels:  
    name: kube-system  
spec:  
  ports:  
  - port: 8081  
    targetPort: 80  
    protocol: TCP  
  selector:  
    name: nginx-3 

yaml Create Deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: 名字
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: front-end
          image: 基于什么镜像
          ports:
            - containerPort: 80
        - name: 
          image: 
          ports:
            - containerPort: 5000