Kubernetes 属于主从分布式架构,主要由 Master 节点和 Node 节点组成,以及包括命令行工具 kubectl 和其它附加项。node
节点 | 组件 | 功能 |
Master | API server | 资源操做的惟一入口,以 RESTful API 方式供客户端工具和其余组件调用 |
scheduler | 负责资源调度,将Pod绑定到Node节点 | |
controller-manager | 管理控制器,包括 Endpoint Controller,Replication Controller 等 | |
etcd | 高可用的键值存储数据库,用于存储集群的配置信息和各类资源状态信息 | |
Node | kubelet | 节点代理,Pod的生命周期管理并向Master报告Pod运行状态 |
kube-proxy | 网络代理和负载均衡,将service接收到的请求转发给Pod |
Kubernetes 集群部署有3种方式:kubeadm、minikube和二进制包。数据库
部署 Kubernetes cluster(单机版)最简单的方式是 minikube:安装 Docker;下载 kubectl;安装 minikube;启动 minikube。bash
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 44s v1.15.0
使用 Kubectl 建立和管理 deployment,deployment 负责建立和更新应用实例。建立 deployment 后,Master 会将 deployment 建立的应用实例调度到集群中的 Node 节点。网络
应用实例建立后,Deployment Controller 会持续监视这些实例。若是管理实例的 Node 节点被销毁,Deployment Controller 会建立新的应用实例,实现自我修复能力。架构
(1)使用 Kubectl 发送部署请求给 API Server;app
(2)API Server 通知 Controller-manager 建立一个 deployment;负载均衡
(3)Scheduler 执行调度任务,将 Pod 副本发送到 Node 节点;分布式
(4)Node 节点上的 kubelet 建立并运行 Pod。ide
$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
deployment.apps/kubernetes-bootcamp created工具
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1/1 1 1 2m11s
(1)Pod 是 Kubernetes 中的最小单位,建立 deployment 时,会建立具备容器的 Pod,每一个 Pod 将被绑定到 Node 节点上。Pod 是一个抽象化概念,包括:
(2)Node 是 Kubernetes 中的工做节点,能够是虚拟机或物理机。Node 由 Master 管理,Node 上能够有多个 Pod。当一个 Node 节点销毁时,在该节点上运行的 Pod 也会销毁,而后经过 Replication Controller 动态建立新的 Pod。
每一个 Node 上至少运行着:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5b48cfdcbd-d49wp 1/1 Running 0 16s
$ kubectl describe pods
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
$ echo $POD_NAME
kubernetes-bootcamp-5b48cfdcbd-d49wp
$ kubectl logs $POD_NAME
$ kubectl exec -ti $POD_NAME bash
root@kubernetes-bootcamp-5b48cfdcbd-d49wp:/#
Service 是一个抽象的概念,它定义了一组逻辑的 Pod,应用能够方便的实现服务发现和负载均衡。使用 YAML 或 JSON 来定义 Service,Service 经过 Label Selector 来匹配一组 Pod。
Service 集成了负载均衡器,能够将网络流量分发到 deployment 暴露的全部 Pod。Service 使用 Endpoints 持续监控运行的 Pod,以确保将流量分配到可用的 Pod。
能够在 ServiceSpec 中经过 type 指定 Service 类型:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5b48cfdcbd-6tmcr 1/1 Running 0 93s
$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3m50s
kubernetes-bootcamp NodePort 10.111.106.144 <none> 8080:30216/TCP 5s
$ kubectl get services -l run=kubernetes-bootcamp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-bootcamp NodePort 10.111.106.144 <none> 8080:30216/TCP 2m9s
$ kubectl describe services/kubernetes-bootcamp
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=30216
$ kubectl delete service -l run=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
前面咱们建立了一个 deployment,而后经过 Service 暴露,deployment 建立的 Pod 来运行应用。当流量增长时,咱们须要对应用进行扩展。
经过更改 deployment 副本数实现对应用的扩展。
$ kubectl scale deployments/kubernetes-bootcamp --replicas=2 deployment.extensions/kubernetes-bootcamp scaled $ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 2/2 2 2 44s $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kubernetes-bootcamp-5b48cfdcbd-4d5w2 1/1 Running 0 23s 172.18.0.6 minikube <none> <none> kubernetes-bootcamp-5b48cfdcbd-55b4g 1/1 Running 0 44s 172.18.0.5 minikube <none> <none>
滚动更新经过 deployment 实现应用实例在不停机状况下进行更新,新的 Pod 会逐步调度到可用的 Node 节点。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5b48cfdcbd-rwd82 1/1 Running 0 7m12s
kubernetes-bootcamp-5b48cfdcbd-w68tj 1/1 Running 0 7m12s
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.extensions/kubernetes-bootcamp image updated
$ kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out
$ kubectl rollout undo deployments/kubernetes-bootcamp
deployment.extensions/kubernetes-bootcamp rolled back