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)最重要的项目之一,是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。
Borg架构

2、kubernetes的架构

kubernetes的物理结构为master/node模式。架构分为master节点和node节点,master节点主要负责集群的管理,node节点主要负责容器的运行。

K8S集群至少需要一个Master节点和一个Node节点,Master节点是集群的控制节点,负责整个集群的管理和控制,主要用于暴露API、调度部署和对节点进行管理,Node节点主要负责容器的运行。

kubernetes的架构如下图所示:
K8S架构

二、kubernetes组件

k8s组件

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

label示意图

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数量。

deployment

(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:容器镜像

(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封装起来,提供统一的访问入口。

service

(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
posted @ 2023-06-19 16:03  休耕  阅读(102)  评论(0编辑  收藏  举报