kubernetes入门

操作系统:centos7.3
软件版本:kubernetesV1.9

初步认识kubernetes


What is kubernetes?
Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications.

特点:

Automating deployment:自动部署
Scaling:伸缩
Management of containerized applications:管理容器应用

1、google容器内部容器编排系统borg目前又称omega的开源版,该项目由google 2014年开始启动,kubernetes 1.0版本在2015年7月21日正式发布。
2、2017年7月google联合 linux基金会(Linux Foundation)创办了CNCF基金会(Cloud Native Computing Foundation)并将kubernetes种子项目捐献给了CNCF基金会。
3、2017年kubernetes总共发布了四个版本,主要是在多用户、多负载、安全性和易用性方面做了改进。分别是:
安全性和易用性方面做了改进。分别是:
Kubernetes 1.6:伸缩性SLO支持包含5000个节点(15万pod)的集群和动态存储。
Kubernetes 1.7:network policy API加强网络安全性。
Kubernetes 1.8:角色访问控制功能变为稳定版。
Kubernetes 1.9:支持window系统。

kubernetes能做什么?

1、容器的自动化部署和升级
2、容器的自动伸缩
3、以集群的方式部署容器,并提供容器间的负载均衡
4、容器的自动修复和健康检查

为什么使用kubernetes?

两个维度
背景维度
1、大量巨头加入CNCF基金会,人多力量大,出现问题也不怕。
2、2017年下半年kubernetes已经完全赢得了容器大战。
技术维度
3、Kubernetes具备超强的横向扩展能力,只要架构设计的好,甚至可以在线的线性扩展。
4、kubernetes采用传统的master-slave架构在container上层又封装了层pod,这样设计非常简单灵活,能更好的适应和管理微服务。

总结:

kubernetes的基本概念

cluster
cluster是计算、存储、网络的资源的集合,kubernetes利用这些资源运行各种基于容器的应用。

POD
pod是kubernetes最小的调度单元,一个pod对应一个或多个container,通常会将紧密相连的一组应用放到一个pod中,同一个pod的container共享ip和namespace。

为什么使用pod?
方便管理
在kubernetes中pod是container的载体,一个pod里面拥有一个或多个container,做为一个逻辑单元,方便管理。

资源共享和通信
同一个pod中的container共享一个网络栈和存储,相互之间可以直接通过localhost进行通信,同时也共享同一块存储卷。

灵活
kubernetes直接管理对象是pod,而不是底层的docker,对于docker的操作,被封装在pod中,不会直接操作,这也意味着,pod包含也可以是其他公司的容器产品,比如coreos的rkt或阿里巴巴的pouch。

ontroller
kubernetes使用controller来创建和管理pod,controller中定义了pod的部署特性,比如部署几个副本,在什么样的node上运行。
为满足不同的业务需求,kubernetes提供了如下controller。

Deployment
是最常用的 Controller,比如前面就是通过创建 Deployment 来部署应用的。Deployment 可以管理 Pod 的多个副本,并确保 Pod 按照期望的状态运行。

Replicaset
实现了 Pod 的多副本管理。使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,我们通常不需要直接使用 ReplicaSet。

Daemonset
用于每个 Node 最多只运行一个 Pod 副本的场景。正如其名称所揭示的,DaemonSet 通常用于运行 daemon。

StatefuleSet
能够保证 Pod 的每个副本在整个生命周期中名称是不变的。而其他 Controller 不提供这个功能,当某个 Pod 发生故障需要删除并重新启动时,Pod 的名称会发生变化。同时 StatefuleSet 会保证副本按照固定的顺序启动、更新或者删除。

Job
用于运行结束就删除的应用。而其他 Controller 中的 Pod 通常是长期持续运行。

service
直接接通过pod的ip加端口去访问应用是不靠谱的,因为pod的生命周期是不断变化的,每次重新生成的pod ip地址都是都是不一样的,并且当pod有多个副本时,这样的访问就更痛苦了,所以kubernetes通过service来解决这些问题,简单来说,你可以把service理解为一个负载均衡器,也可以说是service是为一组功能相同的pod提供统一入口。
Service默认有自己的ip和端口的叫cluster-ip和port,内部可以直接通过这个endpoint(clusterip+port)去访问应用。 不过有一点需要注意,这个cluster-ip是个virtual_IP,它是ping不通的,底层是通过node节点的kube-proxy调用iptables生成对应的转发规则,新版本的kube-proxy可以直接使用ipvs效率更高,不过目前还在测试阶段。
namespace
这里根linux的namespace不一样,这个更像是一个分组。
通过namespace将用户创建的controller和pod等资源分开。namespace可以将一个物理的cluster划成多个虚拟的cluster,每个cluster就是一个namespace,不同的namespace里面资源是完全隔离的。便于不同分组共享使用集群物理资源的同时,还能被管理。使用Namespace来组织Kubernetes的各种对象,可以实现对用户的分组,即“多租户”的管理。对不同的租户还可以进行单独的资源配额设置和管理,使得整个集群的资源配置非常灵活、方便。一个集群中的资源总是有限的,当这个集群被多个租户的应用同时使用时,为了更好地使用这种有限的共享资源,需要将资源配额的管理单元提升到租户级别,通过在不同租户对应的Namespace上设置对应的ResourceQuota即可达到目的。
kubernetes默认创建了三个namespace,default、kube-public、kube-system。

default:默认创建的资源将放到这个namespace里面。
kube-system:kubernetes自己创建的系统资源将放这里。
kube-public:kubernetes自己创建的命名空间,用于确保整个集群中公开的看到某些资源。
创建pod时指定namespace

1
kubectl --namespace=<insert-namespace-name-here> run nginx --image=nginx  

label
Label以key/value键值对的形式附加到各种对象上,如Pod、Node等。Service通过selector label建立service和pod的关联,简单来说,资源和资源之间的关联都是通过label,通过给一个资源绑定一个或多个不同的label,实现多维度的资源管理,selector label类似于sql语句的where。

总结:

kubernetes的架构

角色上:
典型的master-slave架构
master节点
node节点或叫Minion节点
功能上:
master节点做为集群大脑
node节点用于承载部署的容器应用

master节点

master是cluster的大脑,类似openstack的控制节点,运行着apiserver、controller-manager、scheduler它的主要职责是对资源管理、调度,还有认证、弹性伸缩、安全认证。

master节点组件构成
etcd
kubernetes的后端数据存储系统,cluster中的所有资源对象数据都存储在这,用于配置共享和服务发现。

kube-apiserver
1、整个集群管理的api接口,所有对集群的操作和查询都需要经过api-server。
2、集群内各个模块通信的枢钮,集群内其他模块,互相之间并不能直接通信,都是通过api-server打交道,来完成自己那部分工作。
3、集群安全控制,apiserver提供了集群的安全验证,和角色权限分配。
4、连接etcd,集群内所有组件都不能直接连接etcd只能通过api-server去连接etcd。

kube-controller-manager
1、负责集群的故障检测和修复。
2、根据deployment的定义,维持正确的pod副本数。
3、根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新。
4、为新的namespace创建帐户和api访问token。

kube-scheduler
创建pod时,选择合适的node进行调度。
kube-dns
kubernetes中的域名解析服务器。
flannel
flannel的网络组件。
kube-dashboard
kubernetes的web控制端

node节点

运行容器应用,由mater管理,接收master节点的各类请求,进行容器的创建和管理,并将运行在上面的容器应用上报到master节点,类似openstack的计算节点。

node节点组件介绍

kubelet
负责node节点容器的创建、删除监控等生命周期管理,上报node信息如cpu、内存、pod的ip等信息导master节点的api-server
kube-proxy
用于实现端口映射和负载均衡。
kube-dns
kubernetes的域名解析服务器
flannel
网络flannel的组件

根openstack类比

角色功能上
kubernetes分为master节点和node节点,其中master节点是大脑,node节点上承载master调度过来的资源,接收master节点的各类请求。这点根openstack的control节点和compute节点基本一样。
组件作用上
master节点
先从etcd说起,etcd做为kubernetes的后端数据存储系统用于配置共享和服务发现,和openstack中的控制节点的数据库和消息队列服务提供的服务相似。
kube-api-server在kubernetes提供集群管理的api接口,角色的权限分配和安全验证,和openstack中的keystone和各类组件的api-server相似。
kube-scheduler在kubernetes中为pod选择最合适的node节点。与openstack的nova-scheduler提供功能相似。
node节点
kubelet在node节点上负责pod的创建和生命周期的管理,同时对宿主机资源使用情况进行上报到master,与openstack的nova-compute所提供的功能非常一致。
docker运行容器的引擎根openstack的hypervisor提供的功能一致。kubelet调用docker创建容器,nova-compute调用kvm去创建虚拟机。

总结:

kubernetes的部署

kubeadm

kubeadm为kubernetes官方推荐的自动化部署工具,它将kubernetes的组件以pod的形式部署在master节点和node节点上并自动完成证书认证等操作。因为kubeadm默认要从google的镜像仓库下载镜像,所以需要翻墙或提前下好导入。

源码安装

https://github.com/kubernetes/kubernetes/tree/release-1.9
github上下载对应版本的源码包,编译,自己生成证书编写systemd启动文件。
推荐先用kubeadm装一遍,熟悉下各个组件,在用源码安装了解组件之间的调用关系。

总结:

kubernetes的基本操作

集群操作

查看集群信息

1
kubectl cluster-info


查看组件健康状态

1
kubectl get cs

集群操作

1
kubectl get pod --all-namespaces

查看指定namespace的pod的状态以kube-system为例

1
kubectl get pod --namespace=kube-system

查看pod详细信息

1
kubectl describe pod kube-apiserver-master --namespace=kube-system

查看pod详细run信息

1
kubectl get pods -o wide

删除service

1
kubectl delete service service_name

设置label

1
kubectl label node node-1 disktype=ssd  

查看设置的label

1
kubectl get node --show-labels

应用操作

例子(参考cloudmanhttps://steemit.com/kubernetes/@cloudman6/k8s-kubernetes-3)
部署应用(kubernetes-bootcamp)

1
kubectl run kubernetes-bootcamp --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080

查看部署的应用,这里deployment为kubernetes术语,理解为应用。

1
kubectl get deployment

docker镜像通过–image指定
–port设置应用对外服务的端口。

流程:
1、kubectl发送应用部署请求到kube-apiserver,kube-apiserver将请求写入etcd中。
2、api-server通知kube-controller-manger,创建一个deployment对象。将结果通过api-server写入etcd。
3、Scheduler发现后,执行调度流程,为这个新Pod选定一个落户的Node,然后通过API Server将结果写入到etcd中。
4、目标节点kubelet进程通过api-server检测这个新生的pod,并按照定义创建pod。

查看当前pod

1
kubectl get pods

查看 pod实际运行在哪个节点上

1
kubectl get pod  -o wide

访问

默认情况下使用pod只能在集群内部进行访问,为了能在外部访问容器,需要将容器应用的端口映射到node节点端口。
修改kubernetes-bootcamp的端口类型为NodePort,容器内端口为8080,映射的端口会自动从30000~32767中挑选一个。
services可以认为是端口映射。

1
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port=8080

kubernetes-bootcamp分配到了node-2上,可以直接访问node-2的:31079

scale应用(弹性伸缩)
当前kubernetes-bootcamp副本数还是为1

扩展应用为3

1
kubectl scale deployment/kubernetes-bootcamp --replicas=3

pod数也增长为3了。

每次访问nodeip:31079,都是不同的pod给回的返回结果。可以发现每次请求发到了不同的pod上从而实现了负载均衡。

缩减pod数为2

1
kubectl scale deployment/kubernetes-bootcamp --replicas=2


滚动更新
当前应用image版本为v1,升级为v2

1
kubectl set image deployment/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2


可以看见kubernetes是创建出两个v2版本的镜像,然后在缓慢用v2将v1替换掉

在次访问,版本是v2了

回退版本

1
kubectl rollout undo  deployment/kubernetes-bootcamp

验证结果

总结:

参考链接:
http://blog.csdn.net/liukuan73/article/details/54971854
https://steemit.com/kubernetes/@cloudman6/k8s-kubernetes-3