kubernetes入门
一、kubernetes简介
kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,kubernetes的目标是让部署容器化的应用简单并且高效(powerful),kubernetes提供了应用部署,规划,更新,维护的一种机制。kubernetes的目标是让部署容器化的应用简单并且高效(powerful),kubernetes提供了应用部署,规划,更新,维护的一种机制。
kubernetes是可移植、可扩展、开源的容器管理平台,是谷歌 Borg 的开源版本,简称 k8s
。它可以创建应用、更新应用、回滚应用,也可实现应用的扩容缩容,做到故障自恢复
。
- 可移植:基于镜像可从一个环境迁移到另一个环境,支持公有云、私有云、混合云、多重云等多种平台。
- 可扩展:k8s集群可以横向扩展、根据流量实现自动扩缩容。
- 开源的:源代码托管在github上,任何人都可以下载、修改和使用。
kubernetes的特点:
- 自动装箱(Automatic bin packing):可以根据容器的资源需求和约束条件,将容器自动的调度到合适的位置上。
- 自我修复(Self-healing):当容器运行失败时,会自动的重启,替换,或者杀死容器。
- 水平扩展(Horizontal scaling):可以根据CPU或者内存的使用率,将容器进行扩展。
- 服务发现和负载均衡(Service discovery and load balancing):kubernetes可以自动的将容器添加到负载均衡器中,而且可以根据容器的标签,自动的进行服务发现。
- 自动发布和回滚(Automated rollouts and rollbacks):kubernetes可以根据应用的配置文件,自动的发布和回滚应用。
- 机密和配置管理(Secret and configuration management):kubernetes可以部署和更新机密和应用配置。
- 存储编排(Storage orchestration):kubernetes可以自动的挂载分布式存储系统,例如:local存储,公有云存储,网络存储,等等。
- 批量执行(Batch execution):除了管理长期运行的应用,kubernetes也可以管理批量执行的应用。
- 服务网格(Service mesh):kubernetes可以管理应用之间的网络通信。
1、kubernetes的起源
kubernetes 单词起源于希腊语,意为“舵手”或“飞行员”,它是Google基于Borg开源的容器编排调度引擎
,是Google多年大规模容器管理技术的开源版本,也是CNCF(Cloud Native Computing Foundation)最重要的项目之一,是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。
2、kubernetes的架构
kubernetes的物理结构为master/node模式。架构分为master节点和node节点,master节点主要负责集群的管理,node节点主要负责容器的运行。
K8S集群至少需要一个Master节点和一个Node节点,Master节点是集群的控制节点,负责整个集群的管理和控制,主要用于暴露API、调度部署和对节点进行管理,Node节点主要负责容器的运行。
kubernetes的架构如下图所示:
二、kubernetes组件
1、master节点组件
master节点主要包含以下组件:
- kube-apiserver:提供HTTP Rest接口的关键组件,是kubernetes的核心组件,提供了集群的管理操作,例如:创建,更新,删除,等等。整个系统的数据总线和数据中心,并提供认证、授权、访问控制、API注册和发现等机制,并将操作对象持久化到etcd中。
- kube-scheduler:负责对集群中的Pod进行调度,决定将Pod调度到哪个节点上运行。scheduler通过与apiserver交互监听到创建Pod副本的信息后,它会检索所有符合该Pod要求的工作节点列表,开始执行Pod调度逻辑。
- kube-controller-manager:集群内部的管理控制中心,负责集群中的资源对象的自动化控制,例如:故障检测,自动扩展,滚动更新,等等。当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
- etcd:高可用的键值数据库,保存了整个集群的状态信息和网络信息,是kubernetes集群的数据存储中心。
- calico:网络插件,负责为Pod分配IP地址,实现Pod之间的通信。
- docker:容器运行时,负责容器的创建,启动,停止,删除等。k8s1.20版本之后建议废弃docker,使用container作为容器运行时。
2、node节点组件
node节点主要包含以下组件:
- kubelet:管理k8s的命令行工具,操作k8s中的资源对象,如创建,启动,停止,删除等。
- kube-proxy:提供网络代理和负载均衡,是实现service的通信与负载均衡机制的重要组件,kube-proxy负责为Pod创建代理服务,从apiserver获取所有service信息,并根据service信息创建代理服务,实现service到Pod的请求路由和转发,从而实现K8s层级的虚拟转发网络,将到service的请求转发到后端的pod上。
- calico:一套开源的网络和网络安全方案,用于容器、虚拟机、宿主机之前的网络连接,可以用在kubernetes、OpenShift、DockerEE、OpenStrack等PaaS或IaaS平台上。
- coredns:其实就是一个 DNS 服务,而 DNS 作为一种常见的服务发现手段,很多开源项目以及工程师都会使用 CoreDNS 为集群提供服务发现的功能,Kubernetes 就在集群中使用 CoreDNS 解决服务发现的问题。
- docker:容器运行时,负责启动容器的,在k8s1.20版本之后建议废弃docker,使用container作为容器运行时。
三、kubernetes的核心资源
1、Pod
Pod 是kubernetes的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定镜像,用来运行具体的服务。
Pod 代表集群上正在运行的一个进程,一个 Pod 封装一个容器(或多个容器),Pod 里的容器共享存储、网络等。即 Pod 是一组容器的集合,Pod 里面的容器共享网络和存储资源,是一组容器的逻辑主机。
(1)创建Pod的yaml文件
在k8s中,所有的资源都可以使用一个 yaml 配置文件来创建,创建 Pod 也可以使用 yaml 配置文件,如下所示:
apiVersion: v1
kind: Pod
metadata:
name: tomcat-pod
namespace: default
labels:
tomcat: tomcat-pod
spec:
containers:
- name: tomcat-pod-java
ports:
- containerPort: 8080
image: tomcat:8.5.61-jdk8-openjdk
imagePullPolicy: IfNotPresent
参数说明:
- apiVersion:指定k8s的版本
- kind:指定资源类型,这里是Pod
- metadata:元数据,指定Pod的名称和标签
- name:Pod的名称
- namespace:Pod所在的命名空间,默认为default
- spec:指定Pod的规格,包括容器的信息,如容器名称,镜像,端口等
- containers:容器列表,指定Pod中的容器信息
- name:容器名称
- image:容器镜像
- imagePullPolicy: 镜像拉取策略,如果本地没有镜像,是否从远程拉取,默认为Always,如果本地有镜像,不会从远程拉取
(2)操作Pod命令
如下所示:
# 准备yaml文件
[root@master ~]# mkdir tomcat-test && cd tomcat-test
[root@master tomcat-test]# vi pod.yaml
# 创建Pod
[root@master tomcat-test]# kubectl apply -f pod.yaml
pod/tomcat-pod created
# 查看Pod
[root@master tomcat-test]# kubectl get pods -l tomcat=tomcat-pod
NAME READY STATUS RESTARTS AGE
tomcat-pod 0/1 ContainerCreating 0 19s
# 查看Pod详细信息
[root@master tomcat-test]# kubectl describe pod tomcat-pod
# 删除Pod
[root@master tomcat-test]# kubectl delete pod tomcat-pod
pod "tomcat-pod" deleted
2、label
label是k8s中的标签,可以用来标识资源,如Pod,Service,ReplicaSet,Deployment等,label是k8s中资源的一个重要属性,可以用来标识资源,也可以用来筛选资源。
- k8s中的资源对象大都可以打上标签
- 一个资源可以绑定任意多个label
- 通过 Label 可实现多维度的资源分组管理
- 可通过 Label Selector 查询和筛选拥有某些 Label 的资源对象,如:
kubectl get pods -l app=nginx
3、Deployment
Deployment是k8s中的部署对象,用来部署Pod,Deployment是Pod的一层封装,可以实现Pod的自动化管理,如:Pod的自动创建,自动扩容,自动更新等。
Replicaset是k8s中的副本控制器,管理Pod,使pod副本的数量始终维持在预设的个数。
Deployment是管理Replicaset和Pod的副本控制器,Deployment可以管理多个Replicaset,是比Replicaset更高级的控制器,也即是说在创建Deployment的时候,会自动创建Replicaset,由Replicaset再创建Pod,Deployment能对Pod扩容、缩容、滚动更新和回滚、维持Pod数量。
(1)创建Deployment配置文件
在K8s中,所有的资源都可以使用一个yaml配置文件来创建,创建Deployment也可以使用yaml配置文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
参数说明:
- apiVersion:指定k8s的版本
- spec: 指定Deployment的规格,包括副本数量,Pod模板等
- selector:指定Pod的标签,Deployment会根据标签选择对应的Pod
- matchLabels:指定Pod的标签
- replicas:指定Pod的副本数量
- template:指定Pod的模板
- metadata:指定Pod的标签
- labels:指定Pod的标签
- spec:指定Pod的规格,包括容器的信息,如容器名称,镜像,端口等
- containers:容器列表,指定Pod中的容器信息
- name:容器名称
- image:容器镜像
- metadata:指定Pod的标签
- selector:指定Pod的标签,Deployment会根据标签选择对应的Pod
(2)操作Deployment
# 创建Deployment
[root@master ~]# kubectl apply -f deployment.yaml
deployment.apps/my-nginx created
# 查看Deployment
[root@master ~]# kubectl get deployment | grep my-nginx
my-nginx 1/1 1 1 2m8s
# 查看Replicaset
[root@master ~]# kubectl get replicaset | grep my-nginx
my-nginx-5f7b7f6d88 1 1 1 2m17s
# 查看Pod
[root@master ~]# kubectl get pods -l run=my-nginx
NAME READY STATUS RESTARTS AGE
my-nginx-5f7b7f6d88-4q9q8 1/1 Running 0 2m34s
my-nginx-5f7b7f6d88-6q9q8 1/1 Running 0 2m34s
# 删除Deployment
[root@master ~]# kubectl delete deployment my-nginx
deployment.apps "my-nginx" deleted
4、Service
Service
是k8s中的服务对象,用来暴露Pod,Service是Pod的一层封装,可以实现Pod的负载均衡,Service是k8s中的四种服务对象之一,另外三种分别是:Ingress,NodePort,LoadBalancer。
在kubernetes中,Pod是有生命周期的,若Pod重启IP很有可能会发生变化。为了解决这个问题,kubernetes提供了Service对象,Service对象是一个虚拟的IP,它把后端的Pod封装起来,提供统一的访问入口,这样就可以通过Service来访问后端的Pod,而不用关心Pod的IP地址。
Label Selector
:Service通过Label Selector来选择后端的Pod,Service会把所有Label Selector匹配的Pod封装起来,提供统一的访问入口。
(1)创建Service配置文件
在K8s中,所有的资源都可以使用一个yaml配置文件来创建,创建Service也可以使用yaml配置文件。创建service.yaml
文件,内容如下:
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx
参数说明:
- apiVersion:指定k8s的版本
- spec: 指定Service的规格,包括类型,端口,标签选择器等
- type:指定Service的类型,有三种类型:ClusterIP,NodePort,LoadBalancer
- ports:指定Service的端口
- port:指定Service的端口
- protocol:指定Service的协议
- selector:指定Service的标签选择器,Service会根据标签选择对应的Pod
- run:指定Pod的标签
(2)操作Service
# 准备pod配置
[root@master ~]# vim pod_test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
# 创建pod
[root@master ~]# kubectl apply -f pod_test.yaml
deployment.apps/my-nginx created
# 创建Service
[root@master ~]# kubectl apply -f service.yaml
service/my-nginx created
# 查看Service
[root@master ~]# kubectl get service -l run=my-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx NodePort 10.97.108.237 <none> 80:30571/TCP 33s
# 查看nginx服务
[root@master ~]# curl 10.97.108.237
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# 删除Service
[root@master ~]# kubectl delete service -l run=my-nginx
service "my-nginx" deleted