kubernetes 2022-05-05

一、 核心组件

· etcd 保存了整个集群的状态

· apiserver 提供了资源操作的唯一入口,并提供了认证授权、访问控制、API注册和发现机制;

· controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

· scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;

· kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;

· Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);

· kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡

除了核心组件,还有一些推荐的 Add-ons:

· kube-dns 负责为整个集群提供 DNS 服务

· Ingress Controller 为服务提供外网入口

· Heapster 提供资源监控

· Dashboard 提供 GUI

· Federation 提供跨可用区的集群

· Fluentd-elasticsearch 提供集群日志采集、存储与查询

参考文档:https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
二、kubernetes 基本概念

1.Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用 namespace 隔离不同的软件运行环境,并通过镜像自包含软件的运行环境,从而使得容器可以很方便的在任何地方运行。

由于容器体积小且启动快,因此可以在每个容器镜像中打包一个应用程序。这种一对一的应用镜像关系拥有很多好处。使用容器,不需要与外部的基础架构环境绑定, 因为每一个应用程序都不需要外部依赖,更不需要与外部的基础架构环境依赖。完美解决了从开发到生产环境的一致性问题。

容器同样比虚拟机更加透明,这有助于监测和管理。尤其是容器进程的生命周期由基础设施管理,而不是被进程管理器隐藏在容器内部。最后,每个应用程序用容器封装,管理容器部署就等同于管理应用程序部署。

2. Pod 是一组紧密关联的容器集合,它们共享 IPC 和 Network namespace,是 Kubernetes 调度的基本单位。Pod 内的多个容器共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。

Kubernetes 使用 Pod 来管理容器,每个 Pod 可以包含一个或多个紧密关联的容器。

3. Node 是 Pod 真正运行的主机,可以是物理机,也可以是虚拟机。为了管理 Pod,每个 Node 节点上至少要运行 container runtime(比如 docker 或者 rkt)、kubelet 和 kube-proxy 服务。

4. Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default),而 node, persistentVolumes 等则不属于任何 namespace。

5. Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。

每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址

或 DNS 来访问服务,而不需要了解后端容器的运行。


6. Label 是识别 Kubernetes 对象的标签,以 key/value 的方式附加到对象上(key 最长不能超过 63 字节,value 可以为空,也可以是不超过 253 字节的字符串)。

Label 不提供唯一性,并且实际上经常是很多对象(如 Pods)都使用相同的 label 来标志具体的应用。

Label 定义好后其他对象可以使用 Label Selector 来选择一组相同 label 的对象(比如 ReplicaSet 和 Service 用 label 来选择一组 Pod)。Label Selector 支持以下几种方式:

· 等式,如 app=nginx 和 env!=production

· 集合,如 env in (production, qa)

· 多个 label(它们之间是 AND 关系),如 app=nginx,env=test

7. Annotations 是 key/value 形式附加于对象的注解。不同于 Labels 用于标志和选择对象,Annotations 则是用来记录一些附加信息,用来辅助应用部署、安全策略以及调度策略等。比如 deployment 使用 annotations 来记录 rolling update 的状态。

三、基础命令

1.

$ kubectl run --image=nginx:alpine nginx-app --port=80

deployment "nginx-app" created

$ kubectl get pods

NAME                        READY    STATUS    RESTARTS  AGE

nginx-app-4028413181-cnt1i  1/1      Running  0          52s

· kubectl get - 类似于 docker ps,查询资源列表

· kubectl describe - 类似于 docker inspect,获取资源的详细信息

· kubectl logs - 类似于 docker logs,获取容器的日志

· kubectl exec - 类似于 docker exec,在容器内执行一个命令

2. 使用 yaml 定义 Pod

上面是通过 kubectl run 来启动了第一个 Pod,但是 kubectl run 并不支持所有的功能。在 Kubernetes 中,更经常使用 yaml 文件来定义资源,并通过 kubectl create -f file.yaml 来创建资源。比如,一个简单的 nginx Pod 可以定义为:

apiVersion: v1

kind: Pod

metadata:

  name: nginx

  labels:

    app: nginx

spec:

  containers:

  - name: nginx

    image: nginx

    ports:

    - containerPort: 80

3. 使用 Volume

Pod 的生命周期通常比较短,只要出现了异常,就会创建一个新的 Pod 来代替它。那容器产生的数据呢?容器内的数据会随着 Pod 消亡而自动消失。Volume 就是为了持久化容器数据而生,比如可以为 redis 容器指定一个 hostPath 来存储 redis 数据

apiVersion: v1

kind: Pod

metadata:

  name: redis

spec:

  containers:

  - name: redis

    image: redis

    volumeMounts:

    - name: redis-persistent-storage

      mountPath: /data/redis

  volumes:

  - name: redis-persistent-storage

    hostPath:

      path: /data/

Kubernetes volume 支持非常多的插件,可以根据实际需要来选择

· emptyDir

· hostPath

· gcePersistentDisk

· awsElasticBlockStore

· nfs

· iscsi

· flocker

· glusterfs

· rbd

· cephfs

· gitRepo

· secret

· persistentVolumeClaim

· downwardAPI

· azureFileVolume

· vsphereVolume

4.使用 Service

前面虽然创建了 Pod,但是在 kubernetes 中,Pod 的 IP 地址会随着 Pod 的重启而变化,并不建议直接拿 Pod 的 IP 来交互。那如何来访问这些 Pod 提供的服务呢?使用 Service。Service 为一组 Pod(通过 labels 来选择)提供一个统一的入口,并为它们提供负载均衡和自动服务发现。比如,可以为前面的 nginx-app 创建一个 service

$ kubectl expose deployment nginx-app --port=80 --target-port=80 --type=NodePort

service "nginx-app" exposed

$ kubectl describe service nginx-app

Name:              nginx-app

Namespace:            default

Labels:            run=nginx-app

Selector:              run=nginx-app

Type:              ClusterIP

IP:                10.0.0.66

Port:                  80/TCP

NodePort:                  30772/TCP

Endpoints:            172.17.0.3:80

Session Affinity:          None

No events.

这样,在 cluster 内部就可以通过 http://10.0.0.66 和 http://node-ip:30772 来访问 nginx-app。而在 cluster 外面,则只能通过 http://node-ip:30772 来访问。

你可能感兴趣的:(kubernetes 2022-05-05)