Kubernetes快速入门
文章目录Kubernetes快速入门Kubernetes概念Kubernetes 架构Minikube安装kubectl 使用kubeletkubelet 主要功能Kubernetes快速入门参考URL: https://www.jianshu.com/p/b0ff456c5518Kubernetes tutorial - K8S 官方入门教程 中文翻译参考URL: https://blo...
目录
Kubernetes快速入门
官方参考
https://kubernetes.io
https://github.com/kubernetes/kubernetes
Kubernetes 入门简明教程
Kubernetes 入门简明教程
参考URL: https://gitbook.cn/books/5aadcf4f984e353193a90ddb/index.html?utm_source=dl18041002
Kubernetes入门简介
参考URL: https://blog.csdn.net/kobejayandy/article/details/80877666
k8s入门(kubernetes)–持续学习更新
参考URL: https://blog.csdn.net/qq_35559756/article/details/81836814
K8s基本概念入门
参考URL: https://blog.csdn.net/TM6zNf87MDG7Bo/article/details/79621510
Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S。
K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久。
Kubernetes(k8s)是自动化容器操作的开源平台,基于这个平台,你可以进行容器部署,资源调度和集群扩容等操作。
K8s 在很多大厂得到了应用。就目前现状来看,K8s 开源后,已经迅速成为了容器管理领域的事实标准。
Kubernetes是一个全新的基于容器技术的分布式架构领先方案。利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下:
(1)使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run)。
(2)以集群的方式运行、管理跨机器的容器。
(3)解决Docker跨机器容器之间的通讯问题。
(4)Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态。
让开发者关注在应用开发本身,高可用的事情就交给Kubernetes。不需要在应用层去实现服务治理、服务发现、服务管理、服务的扩缩容,将应用放到k8s集群中,使得可以通过k8s的一些api更加直观方便的管理应用实例,可量产、高一致性。
总体架构
有两类节点,第一类是 Master 节点,即主控节点;第二类是 Node 节点,即工作节点。
Master 节点主要负责控制和维护整个集群的状态,比如创建资源、删除资源。
Node 节点主要负责运行任务,比如启动容器。
我们如果看过其他的分布式架构,会对这种架构非常熟悉, 比如 OpenStack、Hadoop 等架构都比较类似。实际上,在分布式架构里边这种主从分离的架构,相对要比较简单和易用。
k8s在物理上进行划分的时候,划分了两种类型的主机,一个master节点,主要用来调度,控制集群的资源等功能;而node节点,主要是用来运行容器的节点,也就是运行服务的节点。
其实集群都差不多,master用来控制,用来存储各种元数据,node节点是一个工作节点,真正来干活的;node节点定时与master进行通信,通过kubelet进程来汇报信息。
- Master节点
Master 提供集群的管理控制中心,通常情况下,Master 会独立部署,不在上面跑用户容器,以保证整个集群的稳定性和安全。当然可以跑多个 Master 来达到高可用。
Master 主要组件包括:Kube-apiserver、Kube-controller-manager、Etcd。
-
Kube-apiserver
Kube-apiserver 用于暴露 Kubernetes API。任何的资源请求/调用操作都是通过 Kube-apiserver 提供的接口进行。 -
Kube-controller-manager
Kube-controller-manager:运行管理控制器,它们是集群中处理常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成单个二进制文件,并在单个进程中运行。 -
Etcd
Etcd 是 Kubernetes 提供默认的存储系统,保存所有集群数据。所以一般推荐使用时要为 Etcd 数据提供备份计划。
- Node节点
Node 相关组件
Node 即工作节点, 相当于整个集群的身体。
Node 节点负责从 Master 处接收任务并执行,适当地时候调整自己的状态或删除过期的负载。
Node 主要组件包括:Kubelet、Kube-proxy、Docker/Rkt。
- kubelet 是工作节点主要的程序,它会监视已分配给节点的 pod,主要功能包括:创建 Pod 所需的网络、定期执行容器健康检查、上报节点状态
- Kube-proxy
Kube-proxy service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。service会为这个LB提供一个IP,一般称为cluster IP。
向service的请求,进行转发到service所代表的一个具体pod。
基本概念
- Pod:K8s 的基本运行单元;
集群调度的最小单元就是一个pod,一个pod可以是一个容器,也可以是多个容器,例如你运行一个程序,其中使用了nginx,使用mysql了,使用了jetty,那么可以将这三个使用在同一个pod中,对他们提供统一的调配能力,一个pod只能运行在一个主机上,而一个主机上可以有多个pod。
pod的存在主要是让几个紧密连接的几个容器之间共享资源,例如ip地址,共享存储等信息。如果直接调度容器的话,那么几个容器可能运行在不同的主机上,这样就增加了系统的复杂性。
例如你运行一个程序,其中使用了nginx,使用mysql了,使用了jetty,那么可以将这三个使用在同一个pod中。
- service
服务主要是用来提供外界访问的接口,服务可以关联一组pod,这些pod的ip地址各不相同,而service相当于一个复杂均衡的vip,用来指向各个pod,当pod的ip地址发生改变之后,也能做到自动进行负载均衡,在关联的时候,service和pod之间主要通过label来关联,也就是标签(-l表示为label)。
ReplicaSet:Pod 的集合;
Deployment:提供更新支持;
StatefulSets:提供有状态支持;
Volume:数据卷;
Labels:标签,资源间的关联一般通过这个来实现。
Kubernetes主要功能:
-
数据卷
Pod中容器之间共享数据,可以使用数据卷。 -
应用程序健康检查
容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性。 -
复制应用程序实例
控制器维护着Pod副本数量,保证一个Pod或一组同类的Pod数量始终可用。 -
弹性伸缩
根据设定的指标(CPU利用率)自动缩放Pod副本数。 -
服务发现
使用环境变量或DNS服务插件保证容器中程序发现Pod入口访问地址。 -
负载均衡
一组Pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部其他Pod可通过这个ClusterIP访问应用。 -
滚动更新
更新服务不中断,一次更新一个Pod,而不是同时删除整个服务。 -
服务编排
通过文件描述部署服务,使得应用程序部署变得更高效。 -
资源监控
Node节点组件集成cAdvisor资源收集工具,可通过Heapster汇总整个集群节点资源数据,然后存储到InfluxDB时序数据库,再由Grafana展示。 -
提供认证和授权
支持属性访问控制(ABAC)、角色访问控制(RBAC)认证授权策略。
基本对象概念
基本对象:
-
Pod
Pod是最小部署单元,一个Pod有一个或多个容器组成,Pod中容器共享存储和网络,在同一台Docker主机上运行。 -
Service
Service一个应用服务抽象,定义了Pod逻辑集合和访问这个Pod集合的策略。
Service代理Pod集合对外表现是为一个访问入口,分配一个集群IP地址,来自这个IP的请求将负载均衡转发后端Pod中的容器。
Service通过LableSelector选择一组Pod提供服务。
-
Volume
数据卷,共享Pod中容器使用的数据。 -
Namespace
命名空间将对象逻辑上分配到不同Namespace,可以是不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。
命名空间也称为虚拟集群。
- Lable
标签用于区分对象(比如Pod、Service),键/值对存在;每个对象可以有多个标签,通过标签关联对象。
快速开始
kubectl: 即kubernetes的客户端,通过他可以进行类似docker run等容器管理操作。(安装windows docker会默认安装该 客户端)
Minikube: 为了方便大家开发和体验Kubernetes,社区提供了可以在本地部署的Minikube。
官方下载地址: https://github.com/kubernetes/minikube/releases
在没有安装 Minikube 之前,kubectl version 并不能获得 Server 的信息。
所以我们需要运行 minikube start 来创建 Minikube 这一虚拟 Kubernetes 服务器。
Minikube安装
Minikube - Kubernetes本地实验环境
参考URL: https://yq.aliyun.com/articles/221687
Docker社区版中Kubernetes开发
参考URL: https://yq.aliyun.com/articles/508460?spm=a2c4e.11153940.blogcont221687.17.7dd54cecuKJVdk
使用minikube在本机测试kubernetes
参考URL: https://www.e-learn.cn/content/qita/937408#启动一个服务
因为 minikube 启动过程中会下载蛮多东西的(kubeadm、kubelet和启动过程下载的东西)
为了方便大家开发和体验Kubernetes,社区提供了可以在本地部署的Minikube。由于网络访问原因,很多朋友无法使用minikube进行实验。为此我们提供了一个修改版的Minikube,可以从阿里云的镜像地址来获取所需Docker镜像和配置。
使用阿里云重新编译过的minikube,下载地址
http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.0.0/minikube-windows-amd64.exe?spm=a2c4e.11153940.blogcont221687.27.7dd54cecuKJVdk&file=minikube-windows-amd64.exe
https://github.com/AliyunContainerService/minikube
第一步:
下载阿里版本的 minikube-windows-amd64.exe,并重命名为minikube.exe,PATH环境变量加上路径,方便使用。
第二步:
对于使用Hyper-V环境的用户,首先应该打开Hyper-V管理器创建一个外部虚拟交换机,
注意: 外部网络选择一个真实的接口。
注意,外部虚拟交换机选择那个你可以联网的物理接口
交换机起名叫 MinikubeSwitch
第三步:
之后,我们可以用如下命令来创建基于Hyper-V的Kubernetes测试环境
主要以管理员权限执行如下命令
minikube.exe start --registry-mirror=https://registry.docker-cn.com --vm-driver="hyperv" --memory=4096 --hyperv-virtual-switch="MinikubeSwitch"
执行成功结果如下:
C:\windows\system32>minikube.exe start --registry-mirror=https://registry.docker-cn.com --vm-driver="hyperv" --memory=4096 --hyperv-virtual-switch="MinikubeSwitch"
o minikube v1.0.0 on windows (amd64)
$ Downloading Kubernetes v1.14.0 images in the background ...
> Creating hyperv VM (CPUs=2, Memory=4096MB, Disk=20000MB) ...
- "minikube" IP address is 192.168.43.17
- Configuring Docker as the container runtime ...
- Version of container runtime is 18.06.2-ce
: Waiting for image downloads to complete ...
- Preparing Kubernetes environment ...
- Pulling images required by Kubernetes v1.14.0 ...
- Launching Kubernetes v1.14.0 using kubeadm ...
: Waiting for pods: apiserver proxy etcd scheduler controller dns
- Configuring cluster permissions ...
- Verifying component health .....
+ kubectl is now configured to use "minikube"
= Done! Thank you for using minikube!
C:\windows\system32>
一旦Minikube虚拟机启动,用户就可以使用熟悉的Kubectl CLI在Kubernetes集群上执行操作。
Minikube都做了什么?
a. 下载Minikube image镜像iso,下载kubeadm、下载kubelet
b. 根据iso创建一个hyperV 虚拟机minikube
c. 设置虚拟机minikube各种内容环境
d. 创建kubeconfig file
e. kubectl就可以通过kubeconfig file,被配置可以使用minikube
执行完毕 minikube.exe start之后,
再次运行 kubectl version 便可以得到同时 Client 和 Server 这两组信息。
我们可以执行 kubectl get nodes 来获取 Node 的信息(因为 Minikube 是单节点的集群,所以只有一个 Node):
kubectl get nodes
此时,可以看到minikube 状态时Ready 角色是master,v1.14.0 显示是节点上kubelet程序的版本
NAME STATUS ROLES AGE VERSION
minikube Ready master 4d v1.14.0
查看所有pod状态,运行
kubectl get pods -n kube-system:
全部Running则表示集群正常。至此,我们的K8S集群就搭建成功了。
打开k8s UI管理界面
minikube.exe dashboard
访问dashboard的是查看具体url:
minikube.exe dashboard --url
查看vm和cluster的运行状态
minikube.exe status
查看minikube VM节点的IP
minikube.exe ip
至此,minikube完全安装ok。
启动一个服务
C:\windows\system32>kubectl get pod
No resources found.
C:\windows\system32>kubectl run hello-minikube --image=registry.cn-hangzhou.aliyuncs.com/google_containers/echoserver:1.10 --port=8080
deployment.apps “hello-minikube” created
C:\windows\system32>kubectl expose deployment hello-minikube --type=NodePort
service “hello-minikube” exposed
C:\windows\system32>kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-minikube-56cdb79778-9tkdv 0/1 ErrImagePull 0 1m
C:\windows\system32>
# --port=8080是容器的端口
kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080
kubectl expose deployment hello-minikube --type=NodePort
kubectl get pod
curl $(minikube.exe service hello-minikube --url)
获取服务地址
minikube.exe service hello-minikube --url
Kubernetes 三种暴露服务的方式:
-
LoadBlancer Service:LoadBlancer Service 是 kubernetes 深度结合云平台的一个组件;当使用 LoadBlancer Service 暴露服务时,实际上是通过向底层云平台申请创建一个负载均衡器来向外暴露服务;目前 LoadBlancer Service 支持的云平台已经相对完善,比如国外的 GCE、DigitalOcean,国内的 阿里云,私有云 Openstack 等等,由于 LoadBlancer Service 深度结合了云平台,所以只能在一些云平台上来使用。
-
NodePort Service:NodePort Service 顾名思义,实质上就是通过在集群的每个 node 上暴露一个端口,然后将这个端口映射到某个具体的 service 来实现的,虽然每个 node 的端口有很多(0~65535),但是由于安全性和易用性(服务多了就乱了,还有端口冲突问题)实际使用可能并不多。
-
Ingress:Ingress 这个东西是 1.2 后才出现的,通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务。
删除服务
kubectl delete services hello-minikube
kubectl delete deployment hello-minikube
minikube.exe stop
问题整理
minikube.exe status 显示都是空的,使用minikube.exe delete也不行。
解决:
a 打开hyper-v,强制关闭minikube虚拟机,并删除。
b 删除c盘的用户目录下.pentaho目录
c 重新执行之前的minikube.exe start xxx 命令
再次查看,发现正常
C:\windows\system32>minikube.exe status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.43.147
Kubernetes pod状态出现ImagePullBackOff
C:\windows\system32>kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-56cdb79778-9tkdv 0/1 ImagePullBackOff 0 19m
C:\windows\system32>
解决:可以使用describe命令查看这个失败的Pod的明细:
kubectl describe pod hello-minikube-56cdb79778-9tkdv
分析到: Failed to pull image “k8s.gcr.io/echoserver:1.10”: rpc error: code = Unknown desc = Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
说明拉取镜像失败。
修改拉取镜像地址 为阿里地址–image=,如下:
kubectl run hello-minikube --image=registry.cn-hangzhou.aliyuncs.com/google-container/echoserver:1.4 --port=8080
结果还是不行
Failed to pull image “registry.cn-hangzhou.aliyuncs.com/google-container/echoserver:1.4”: rpc error: code = Unknown desc = Error response from daemon: pull access denied for registry.cn-hangzhou.aliyuncs.com/google-container/echoserver, repository does not exist or may require ‘docker login’
发现阿里下载镜像需要登陆
因此执行 minikube.exe ssh进到虚机里,
使用你的阿里hub账号密码登录,并下再相应的镜像
docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/echoserver:1.10
退出,然后
kubectl run hello-minikube --image=registry.cn-hangzhou.aliyuncs.com/google_containers/echoserver:1.10 --port=8080
kubectl 使用
参考URL: https://yeasy.gitbooks.io/docker_practice/content/kubernetes/kubectl.html
kubectl 是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes。
version
输出服务端和客户端的版本信息
help
显示各个命令的帮助信息
kubelet
kubelet 的工作流程
参考URL: https://www.jianshu.com/p/4a068611b43e
kubernetes 是一个分布式的集群管理系统,在每个节点(node)上都要运行一个 worker 对容器进行生命周期的管理,这个 worker 程序就是 kubelet。
简单地说,kubelet 的主要功能就是定时从某个地方获取节点上 pod/container 的期望状态(运行什么容器、运行的副本数量、网络或者存储如何配置等等),并调用对应的容器平台接口达到这个状态。
kubelet 除了这个最核心的功能之外,还有很多其他特性:
- 定时汇报当前节点的状态给 apiserver,以供调度的时候使用
- 镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源 * 运行 HTTP Server,对外提供节点和 pod 信息,如果在 debug 模式下,还包括调试信息
- 等等……
集群状态下,kubelet 会从 master 上读取信息,但其实 kubelet 还可以从其他地方获取节点的 pod 信息。目前 kubelet 支持三种数据源:
- 本地文件
- 通过 url 从网络上某个地址来获取信息
- API Server:从 kubernetes master 节点获取信息
kubelet 主要功能
- Pod 管理
在 kubernetes 的设计中,最基本的管理单位是 pod,pod 是 kubernetes 在容器上的一层封装,由一组运行在同一主机的一个或者多个容器组成。
pod 中所有的容器最大的特性也是最大的好处就是共享了很多资源,比如网络空间。pod 下所有容器共享网络和端口空间,也就是它们之间可以通过 localhost 访问和通信,对外的通信方式也是一样的,省去了很多容器通信的麻烦。
除了网络之外,定义在 pod 里的 volume 也可以 mount 到多个容器里,以实现共享的目的。
最后,定义在 pod 的资源限制(比如 CPU 和 Memory) 也是所有容器共享的。
- 容器健康检查
创建了容器之后,kubelet 还要查看容器是否正常运行,如果容器运行出错,就要根据设置的重启策略进行处理。检查容器是否健康主要有三种方式:执行命令,http Get,和tcp连接。
不管用什么方式,如果检测到容器不健康,kubelet 会删除该容器,并根据容器的重启策略进行处理(比如重启,或者什么都不做)。
- 容器监控
kubelet 还有一个重要的责任,就是监控所在节点的资源使用情况,并定时向 master 报告。知道整个集群所有节点的资源情况,对于 pod 的调度和正常运行至关重要。
kubelet 使用 cAdvisor 进行资源使用率的监控。cAdvisor 是 google 开源的分析容器资源使用和性能特性的工具,在 kubernetes 项目中被集成到 kubelet 里,无需额外配置。
默认情况下,你可以在 localhost:4194 地址看到 cAdvisor 的管理界面。除了系统使用的 CPU,Memory,存储和网络之外,cAdvisor 还记录了每个容器使用的上述资源情况。
更多推荐
所有评论(0)