-
Notifications
You must be signed in to change notification settings - Fork 1
Kubernetes Learning Doc
[TOC]
Kubernetes 的抽象性允许您将容器化的应用程序部署到集群,而不必专门将其绑定到单个计算机。Kubernetes 用于自动部署,扩展和管理容器化应用程序的开源系统。确保容器化的应用程序在您想要的时间和地点运行,并帮助应用程序找到它们需要的资源和工具。
集群是一组节点,这些节点可以是物理服务器或者虚拟机
-
自动化容器的部署和复制
-
随时扩展或收缩容器规模
-
将容器组织成组,并且提供容器间的负载均衡
-
很容易地升级应用程序容器的新版本
-
提供容器弹性,如果容器失效就替换它
运行 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类型等
这是 Kubernetes 最小、最简单的可用来创建和部署的单元。Pod 是一个 Kubernetes 的资源抽象,表示一个或多个应用容器 (例如 Docker 或 rkt) 组,以及一些用于这些容器的共享资源。
安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。
Kubernetes可以使用Namespaces(命名空间)创建多个虚拟集群。大多数Kubernetes资源(例如pod、services、replication controllers或其他)都在某些Namespace中
保证Pod高可用的API对象,控运行中的Pod来保证集群中运行指定数目的Pod副本。
本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。
用户对K8s集群的一次更新操作。创建一个新的服务、更新一个新的服务,、滚动升级一个服务。
Lable
一个Label是attach到Pod的一对键/值对,用来传递用户定义的属性。
Replication Controller确保任意时间都有指定数量的Pod“副本”。需要指定Pod和Label
一个 Kubernetes 服务是容器组逻辑的高级抽象,同时也对外提供 访问容器组的策略。
一个 Pod 的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。 这一组Po能够被 Service 访问到。
在 Kubernetes 中是一个 REST 对象, 定义可以基于 POST 方式,请求 apiserver 创建新的实例。
每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。在K8s集群中微服务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。
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 服务器
环境: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 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是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便。它实质上是一种通用的数据串行化格式。后文会说明定义YAML文件创建Pod和创建Deployment。
大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tal键,只允许使用空格 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
#表示注释,从这个字符一直到行尾,都会被解析器忽略
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
apiVersion: v1
kind: Service
metadata:
name: kube-system
labels:
name: kube-system
spec:
ports:
- port: 8081
targetPort: 80
protocol: TCP
selector:
name: nginx-3
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