作者|小明菜市場
出典|小明菜市場
头像| CSDN从东方IC下载
前言
到了2020年,你还不知道kubernetes真的真的out了。
什么是k8s? k8s一词来自希腊语,有主管、舵手和船长的意思。 从图标上可以看出。
k8s的网站上说明如下
生产级集装箱编组系统
可以从定义中提取的3个关键字分别是
生产水平
容器
编制系统
1、生产等级说k8s是生产等级,有以下几个原因。
k8s是谷歌的开源系统,基于谷歌的系统设计,在谷歌系统上运行顺利。
k8s是CNCF的第一个毕业项目。
2、容器容器具有以下特点
它是可移植的,容器可以安装和使用于任何类型的操作系统。
包容性:支持可打包到容器中的各种类型的软件。
标准格式。
可以共存,并在同一台物理机器上运行多个容器。
隔离,不同容器的软件相互隔离。
最重要的一句话:没有容器就没有微服务。
容器和微服务化后,带来了一些好处。 例如:
提高了模块之间的独立性,允许单独部署和发布,加快了发布和更新速度
隔离的执行环境。 可以为每个模块定制不同的运行环境
3、编组系统集装箱的编组系统可以有效地管理主机上的集装箱。
管理网络和访问
跟踪集装箱的状态
扩大或缩小服务的规模
实现负载平衡
在宿主机不再响应后,实现容器的再分配
服务发现
集装箱的存储管理等…
主要功能
1、可以在数据卷pod内的容器之间共享数据,使用数据卷。
2、APP应用程序体检容器中的服务可能出现流程阻塞无法处理请求,可设置监测策略
3、复制APP应用实例控制器维护的pod拷贝数,保证一个pod或一组同类prod始终可用
4、弹性伸缩根据设定的指标,自动缩放pod拷贝数
5、服务检测器使用环境变量或DNS插件,确保容器中的程序检测到pod入口访问地址。
6、可以为负载均衡的一组pod副本分配专用的集群ip地址,将负载均衡的请求转发到后端容器,在集群类的其他pod上通过集群ip访问APP应用程序。
7、为了一次更新一个pod,而不是同时删除整个服务,不中断地更新滚动更新服务。
8 .服务组织用文件描述部署服务,以提高APP应用程序的部署效率。
9、资源监控节点组件与cAdvisor资源采集工具集成,通过Heapster汇总后保存在influxDB时序数据库中,最后由Grafana展示。
10、提供认证授权,支持RBAC认证授权机制。
11、设计体系结构
功能组件k8s集群有管理节点、主节点和工作节点、Node两种。
管理节点主节点主要负责k8s集群的管理、集群内各节点之间的信息交互、任务调度、容器、pod、namespaces、pv等生命周期的管理。
工作节点node主要为容器和pod提供计算资源,pod及其容器都运行在工作节点上,工作节点通过kubelet服务与管理节点通信以管理容器的生命周期,并与集群中的其他节点通信
1、master组件kube-apiserverkubernetes api资源操作的唯一入口,各种组件的协调者通过HTTP API提供接口服务,并提供相关的认证、授权等机制
kube-controller-manager处理群集中的常规后台任务,一个资源对应一个控制器,控制器管理器负责管理这些控制器并保持群集的状态。
kube-scheduler负责调度资源,并根据预定策略将pod调度到相应的节点。
2、Node组件kubeletkubelet是主节点上的代理,在管理本机运行容器生命周期的同时,还负责管理卷和网络。
创建容器、装载数据卷、下载servlet以及获取容器和节点的状态等任务。
kube-proxy在Node节点上实现Pod/serviced网络代理,提供cluster内部的服务发现和四层负载均衡。
docker真正运行容器的地方
etcd集群分布式键值对储存系统,用于保存集群状态,比如pod,service等对象信息。
分层架构核心层:最核心的功能,对外提供api 应用层,部署无状态应用,等,和路由。
管理层:系统度量,自动化,以及RBAC等接口层:kubectl命令行工具,以及客户端sdk 生态系统:分为外部的日志,监控等,内部的镜像仓库等。
安装
创建集群首先,查看所使用的minikube 版本:
$ minikube versionminikube version: v0.25.0启动minikube:
$ minikube startStarting local Kubernetes v1.9.0 cluster.Starting VM.Getting VM IP address.Moving files into cluster.Setting up certs.Connecting to cluster.Setting up kubeconfig.Starting cluster components.Kubectl is now configured to use the cluster.Loading cached images from config file.minikube 启动之后,
查看集群版本:
$ kubectl versionClient Version: version.Info{Major:'1', Minor:'9', GitVersion:'v1.9.0', GitCommit:'925c127ec6b946659ad0fd596fa959be43f0cc05', GitTreeState:'clean', BuildDate:'2017-12-15T21:07:38Z', GoVersion:'go1.9.2', Compiler:'gc', Platform:'linux/amd64'}Server Version: version.Info{Major:'', Minor:'', GitVersion:'v1.9.0', GitCommit:'925c127ec6b946659ad0fd596fa959be43f0cc05', GitTreeState:'clean', BuildDate:'2018-01-26T19:04:38Z', GoVersion:'go1.9.1', Compiler:'gc', Platform:'linux/amd64'}这里有两个版本,
查看更详细的版本信息:
$ kubectl cluster-infoKubernetes master is running at https://172.17.0.77:8443To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.集群所在主机的ip 为172.17.0.77。
注意:这里的master 指的是Kubernetes 集群的master 节点。
那怎么看到node 节点呢?
$ kubectl get nodeNAME STATUS ROLES AGE VERSIONhost01 Ready none 20m v1.9.0host01 就是node 节点,在当前环境中,
实际上只有一台主机。
这台主机既作为master 节点,也作为node 节点。
部署应用下面以部署一个nginx 为例来演示部署应用的过程:
$ kubectl run first-app --image=nginx --port=80deployment 'first-app' created通过run 命令创建一个名为first-app 的deployment,
deployment 是干嘛的呢?别急,往下看:
查看当前的deployment:
$ kubectl get deploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEfirst-app 1 1 1 1 1m查看当前的pod:
$ kubectl get podNAME READY STATUS RESTARTS AGEfirst-app-6db44b474-dbbtp 1/1 Running 0 4m查看更详细的pod 内容:
$ kubectl describe pod first-app-6db44b474-dbbtpName: first-app-6db44b474-dbbtpNamespace: defaultNode: host01/172.17.0.77Start Time: Fri, 02 Mar 2018 06:48:02 +0000Labels: pod-template-hash=286006030 run=first-appAnnotations: noneStatus: RunningIP: 172.18.0.4Controlled By: ReplicaSet/first-app-6db44b474Containers: first-app: Container ID: docker://54eacc7ff536d7181fa366883f7ed4cf632492ad6ed391207fea436d22d219a9 Image: nginx Image ID: docker-pullable://nginx@sha256:4771d09578c7c6a65299e110b3ee1c0a2592f5ea2618d23e4ffe7a4cab1ce5de Port: 80/TCP State: Running Started: Fri, 02 Mar 2018 06:48:14 +0000 Ready: True Restart Count: 0 Environment: none Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-zkqw6 (ro)Conditions: Type Status Initialized True Ready True PodScheduled TrueVolumes: default-token-zkqw6: Type: Secret (a volume populated by a Secret) SecretName: default-token-zkqw6 Optional: falseQoS Class: BestEffortNode-Selectors: noneTolerations: noneEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m default-scheduler Successfully assigned first-app-6db44b474-dbbtp to host01 Normal SuccessfulMountVolume 7m kubelet, host01 MountVolume.SetUp succeeded for volume 'default-token-zkqw6' Normal Pulling 7m kubelet, host01 pulling image 'nginx' Normal Pulled 7m kubelet, host01 Successfully pulled image 'nginx' Normal Created 7m kubelet, host01 Created container Normal Started 7m kubelet, host01 Started container
对外发布服务已经部署好了一个nginx 应用,那么要怎么去访问呢?这时候就需要用到service。
创建一个service:
$ kubectl expose deployment/first-app --type='NodePort' --port=80service 'first-app' exposed查看创建好的名为first-app 的service :
$ kubectl get svc first-appNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEfirst-app NodePort 10.102.0.12 none 80:30491/TCP 1m在PORT(S) 一栏中,
这是使用了“NodePort”类型创建service 分配的端口,通过主机ip 和这个端口,就可以访问到这个service 了。
可以使用curl 工具进行访问:
$ curl 172.17.0.77:30491!DOCTYPE htmlhtmlheadtitleWelcome to nginx!/titlestyle body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }/style/headbodyh1Welcome to nginx!/h1pIf you see this page, the nginx web server is successfully installed andworking. Further configuration is required./ppFor online documentation and support please refer toa href='http://nginx.org/'nginx.org/a.br/Commercial support is available ata href='http://nginx.com/'nginx.com/a./ppemThank you for using nginx./em/p/body/html
扩缩应用刚刚已经成功访问到nginx 应用,但有些时候,可能需要多个nginx 来横向扩展,那么在Kubernetes 中怎么实现呢?
$ kubectl scale deployment/first-app --replicas=3deployment 'first-app' scaled再查看当前的pod,
可以看到当前已经有了3 个first-app 了。
$ kubectl get podNAME READY STATUS RESTARTS AGEfirst-app-6db44b474-6vlrj 1/1 Running 0 39sfirst-app-6db44b474-dbbtp 1/1 Running 0 19mfirst-app-6db44b474-gjzgg 1/1 Running 0 39s如果觉得3 个太浪费资源了,
更新应用最常用的就是更新镜像。
之前使用的是docker hub 上最新的nginx,现在用1.10.3 这个比较老的版本来替代最新版本。
先查看当前使用的nginx 版本。
这里有一个很简单的方法,访问一个不存在的页面,如下:
$ curl 172.17.0.77:30491/abchtmlheadtitle404 Not Found/title/headbody bgcolor='white'centerh1404 Not Found/h1/centerhrcenternginx/1.13.9/center/body/html当前使用的nginx 版本是1.13.9,
$ kubectl set image deployment/first-app first-app=nginx:1.10deployment 'first-app' image updated再查看当前nginx 的版本:
$ curl 172.17.0.77:30491/abchtmlheadtitle404 Not Found/title/headbody bgcolor='white'centerh1404 Not Found/h1/centerhrcenternginx/1.10.3/center/body/htmlnginx 版本已经成功更新为1.10.3。
删除应用最后来讲讲删除应用,之前是通过deployment 来创建应用,所以只需要删除deployment 就可以删除对应的应用了。
$ kubectl delete deployment/first-appdeployment 'first-app' deleted再查看一下当前的pod:
$ kubectl get podNo resources found.所有的pod 都已经删除了。
点分享