forked from Coldstream-Louis/Clearwater-data-visualization
-
Notifications
You must be signed in to change notification settings - Fork 8
Kubernetes Learning Doc
ChenCyl edited this page Nov 16, 2018
·
3 revisions
2018/10/15 陈雨蕾
2018/10/17 梁琛
[TOC]
- 容器自动伸缩,修复,检查
- 多容器多机器自动负载均衡
架构图

核心组件
- node:Kubernetes集群中相对于Master而言的工作主机,Node可以是一台物理主机,也可以是一台虚拟机(VM)。在每个Node上运行用于启动和管理Pid的服务Kubelet,并能够被Master管理。
-
pod:Kubernetes的最基本操作单元,包含一个活多个紧密相关的容器,类似于豌豆荚的概念。一个Pod可以被一个容器化的环境看作应用层的“逻辑宿主机”(Logical Host)。一个Pod中的多个容器应用通常是紧耦合的。Pod在Node上被创建、启动或者销毁。
- 作为容器的抽象,故并不限制于Docker。Docker凉了,他也不凉。为Service Mesh做准备。
- etcd:保存了整个集群的状态;
- apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
- controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- Deployment: 最常用的Controller对象。
- scheduler:负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
- kubelet:负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
- 所以kubelet进程的日志可以反应错误的情况与原因。
- Container runtime:负责镜像管理以及 Pod 和容器的真正运行(CRI);
- kube-proxy:负责为 Service 提供 cluster 内部的服务发现和负载均衡
-
Service: 容器在不同机器间切换,IP会变。Service可以为不同但是提供相同功能容器提供统一的入口。
- Ingress:相当于一个分发器,分发给不同的Service,是集群的入口
- **P.S.:**在上面的架构图中没有涉及到网络(pods间通信),网络采用第三方,所以是要自己配置的。

Namespace
- 是什么:资源隔离的一种手段;不同NS中的资源不能相互访问;多租户的一种常见解决方案。
- 拥有:名称
- 关联:Resource
Label
- 是什么:一个Key-Value值对;可以任意定义;可以贴在Resource对象上;用来过滤和选择某种资源。
- 拥有:Key、Value
- 关联:Resource、Label Selector
Service
- 是什么:微服务;容器方式隔离;TCP服务;通常无状态;可以部署多个实例同时服务;属于内部的“概念”,默认外部无法访问;可以滚动升级。
- 拥有:一个唯一的名字;一个虚拟访问的地址;IP地址(ClusterIP)+Port;一个外部系统访问的映射端口NodePort;对应后端分布于不同Node一组服务容器进程。
- 关联:多个相同Label的Pod
Replication Controller
- 是什么:Pod副本控制器;限定某种Pod的当前实例的个数;属于服务集群的控制范畴;服务的滚动升级就是靠它来实现。
- 拥有:一个标签选择器,选择目标Pod;一个数字,表明目标Pod的期望实例数;一个Pod模板,用来创建Pod实例。
- 关联:多个相同Label的Pod
Volumes
- 是什么:Pod上的存储卷;能被Pod内的多个容器使用。
- 拥有:名字;存储空间。
- 关联:Pod
直接使用命令:
$ brew cask install minikube可能会遇到的问题:
- 进度条没到100%就失败了。解决方法:多执行几次
brew cask install minikube - 进度条到了100%后出现错误kube-proxy configmap update: timed out (unknown root cause) 。解决方法:参考https://github.com/kubernetes/minikube/issues/2755中**dciccale**的回答。
启动minukube
$ minikube startrun一个deployment
$ kubectl run deployment名称 --image=镜像名 --replicas=1例如:kubectl run http --image=katacoda/docker-http-server:latest --replicas=1
可以使用以下命令查看deployments的状态
$ kubectl get deployments可以使用以下命令查看deployment的描述
$ kubectl describe deployment deployment名称创建一个服务来暴露Pods的端口。以下命令expose the container port 80 on the host 8000 binding to the external-ip of the host.
$ kubectl expose deployment deployment名称 --external-ip="172.17.0.127" --port=8000 --target-port=80接下来就可以ping一下主机
$ curl http://172.17.0.127:8000以下命令可以用来扩充容器
$ kubectl scale --replicas=数量 deployment deployment名称列出扩充的pods
$ kubectl get pods实例.yaml
apiVersion: extensions/v1beta1 #所使用的 Kubernetes API 版本
kind: Deployment #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: webapp1 #资源的名字,在同一个namespace中必须唯一
spec: #specification of the resource content 指定该资源的内容
replicas: 1 #指定ReplicationController中pod的个数
template:
metadata:
labels:
app: webapp1
spec:
containers: #指定资源中的容器
- name: webapp1 #容器的名字
image: katacoda/docker-http-server:latest #容器使用的镜像地址
ports:
- containerPort: 80 命令
$ kubectl create -f deployment.yaml
$ kubectl get deployment
$ kubectl describe deployment webapp1apiVersion: v1
kind: Service
metadata:
name: webapp1-svc
labels:
app: webapp1
spec:
type: NodePort #The Service makes the application available via a NodePort.
ports:
- port: 80
nodePort: 30080
selector:
app: webapp1$ kubectl create -f service.yaml
$ kubectl get svc
$ kubectl describe svc webapp1-svc
$ curl host01:30080更新 deployment.yaml 中的 replicas 为 4,然后
$ kubectl apply -f deployment.yaml
$ kubectl get deployment
$ kubectl get pods
$ curl host01:30080