Linux——k8s组件

kubernetes 使用1.31.1 版本搭建集群核心组件,选择flannel 网络插件为整体集群的运行提供网络通信功能。

flannel 网络插件

kube-flannel kube-flannel-ds-9fgml 1/1 Running 1 (18m ago) 2d21h

kube-flannel kube-flannel-ds-ghwbq 1/1 Running 1 (18m ago) 2d21h

kube-flannel kube-flannel-ds-mkm4r 1/1 Running 1 (18m ago) 2d21h

K8S核心组件:

1、coredns提供集群内的DNS解析

kube-system coredns-fcd6c9c4-cvcvt 1/1 Running 1 (18m ago) 2d21h

kube-system coredns-fcd6c9c4-m9kxk 1/1 Running 1 (18m ago) 2d21h

2、ectd (基于键值对的数据库) 提供集群数据的存储(1) pod的名称数量(2)网络参数的分配(3)集群的状态

kube-system etcd-control 1/1 Running 1 (18m ago) 2d21h

3、api-server:Kubernetes的api响应服务器,用户向K8S平台发出的所有指令,都是先给到api-server,由APIserver 根据用户的请求以调用不同的组件

kube-system kube-apiserver-control 1/1 Running 1 (18m ago) 2d21h

4、controller-manager:完成pod的启动和状态维护,比如pod停止了,由controller-manager 完成pod的重启

kube-system kube-controller-manager-control 1/1 Running 1 (18m ago) 2d21h

5、kube-proxy:K8s的代理服务

kube-system kube-proxy-54j4f 1/1 Running 1 (18m ago) 2d21h

kube-system kube-proxy-c8cdj 1/1 Running 1 (18m ago) 2d21h

kube-system kube-proxy-v7td8 1/1 Running 1 (18m ago) 2d21h

6、scheduler-control: 调度管理器,决定K8S中运行pod的节点,指定pod的运行节点。

kube-system kube-scheduler-control 1/1 Running 1 (18m ago) 2d21h

pod

pod 是K8S平台上最小的管理单位,pod是K8S平台上运行的进程。

什么是容器?应用容器化的本质是什么?

容器是一个隔离的沙盒环境。容器实现隔离环境所使用的技术是namespace (名称空间)cgroup (控制组)。沙盒环境中包括了运行某一个应用所需要的基本依赖关系和运行的环境(配置文件、日志输出、启动程序等)。一个应用的镜像包括了应用运行所需要的所有的依赖管理和运行环境的支持。应用容器化的本质分为两步:1.将应用运行需要的所有文件打包,制作镜像2. 将镜像中的程序启动(运行起来),程序运行起来之后,就是进程了,换一句叫做运行容器,或者跑一个容器。

总结一下: 容器实际就是在操作系统上使用软件技术隔离一个环境,然后运行程序的过程。所以在容器宿主机上,在容器内部只能看到容器内部启动的进程,举个例子:容器中通常有一个pid为1 的进程,而这个进程不是容器宿主机中pid为1 的进程,容器宿主机中可以看到容器启动的进程,但是并不知道容器具体使用哪个程序启动对应的进程。

pod的重点类似于容器,也是需要在一个相对隔离的环境下启动进程,并为隔离环境中的进程提供需要的网络、存储等资源的访问。但是pod并不是容器,pod提供容器所需要的隔离环境,并为隔离环境内的容器提供必要的网络和存储,所以某种程度上pod 是用来管理容器的上一级概念。

在K8S中,一个pod=一个运行中的应用实例

pod运行容器的方式:

  1. 一个pod中封装一个容器,最简单的运行方式,但是如果需要较为复杂架构的实现,还是需要较为复杂的配置过程。
  2. 一个pod中封装多个容器:可以直接在一个pod中运行所有的服务,比如说lamp等常见组合,另一个原因在于同一个pod中的容器直接基于localhost进行通信,也不需要复杂的网络配置或者繁琐的数据同步。

K8S 资源对象:

  1. pod (最小调度单位,一定属于某一个名称空间)

    1. K8S 的名称空间,一般是为了给不同的项目进行项目环境的隔离而使用的概念,
    2. 类比ansible不同的目录可以代表不同的项目代码,K8S不同的名称空间运行不同的应用
  2. node (K8S工作节点,应用pod一般都运行在工作节点上,node 不属于任何名称空间,同样持久卷也不属于任何名称空间)

    [root@control ~]# kubectl get nodes // 列出节点信息
    NAME STATUS ROLES AGE VERSION
    control Ready control-plane 3d4h v1.31.1
    node1 Ready <none> 3d4h v1.31.1
    node2 Ready <none> 3d4h v1.31.1
    [root@control ~]# kubectl get nodes -o wide // 列出所有节点基本信息
    NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
    control Ready control-plane 3d4h v1.31.1 192.168.110.10 <none> CentOS Stream 9 5.14.0-474.el9.x86_64 containerd://1.7.22
    node1 Ready <none> 3d4h v1.31.1 192.168.110.11 <none> CentOS Stream 9 5.14.0-474.el9.x86_64 containerd://1.7.22
    node2 Ready <none> 3d4h v1.31.1 192.168.110.22 <none> CentOS Stream 9 5.14.0-474.el9.x86_64 containerd://1.7.22
    [root@control ~]# kubectl describe node control // 列出指定节点的详细信息

以相对动态的方式实时获取每一个节点的基本信息,使用一个K8S的组件 metrics-server 来收集每一个节点的内存CPU 等资源的实时使用率,metrics-server将在api-server 中增加关于节点状态收集的api路径,收集到的节点信息可以传递给其他的监控软件使用。

[root@control ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
[root@control ~]# cat .kube/registry_cn
registry.cn-hangzhou.aliyuncs.com/google_containers/
[root@control ~]# mv components.yaml metrics-server.yml
mv: overwrite 'metrics-server.yml'? y
[root@control ~]# vim metrics-server.yml
[root@control ~]# kubectl apply -f metrics-server.yml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
[root@control ~]# kubectl get pods -o wide -n kube-system
NAME                              READY   STATUS    RESTARTS        AGE    IP               NODE      NOMINATED NODE   READINESS GATES
coredns-fcd6c9c4-cvcvt            1/1     Running   1 (6h52m ago)   3d4h   10.244.1.10      node1     <none>           <none>
coredns-fcd6c9c4-m9kxk            1/1     Running   1 (6h52m ago)   3d4h   10.244.1.9       node1     <none>           <none>
etcd-control                      1/1     Running   1 (6h52m ago)   3d4h   192.168.110.10   control   <none>           <none>
kube-apiserver-control            1/1     Running   1 (6h52m ago)   3d4h   192.168.110.10   control   <none>           <none>
kube-controller-manager-control   1/1     Running   1 (6h52m ago)   3d4h   192.168.110.10   control   <none>           <none>
kube-proxy-54j4f                  1/1     Running   1 (6h52m ago)   3d4h   192.168.110.11   node1     <none>           <none>
kube-proxy-c8cdj                  1/1     Running   1 (6h52m ago)   3d4h   192.168.110.10   control   <none>           <none>
kube-proxy-v7td8                  1/1     Running   1 (6h52m ago)   3d4h   192.168.110.22   node2     <none>           <none>
kube-scheduler-control            1/1     Running   1 (6h52m ago)   3d4h   192.168.110.10   control   <none>           <none>
metrics-server-86c648b4bf-tfhjp   1/1     Running   0               50s    10.244.2.10      node2     <none>           <none>
实时监控节点的资源使用情况:
[root@control ~]# kubectl top node
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
control   170m         8%     1636Mi          43%
node1     60m          3%     1109Mi          29%
node2     47m          2%     1019Mi          13%

对于K8S集群中的工作节点的增加和移除:

增加新的工作节点:

  1. 配置工作节点的OCI 、selinux等基础环境
  2. kubeadm join 命令加入到K8S 现有集群中

移除工作节点:

禁止向指定节点调度新的pod

kubectl cordon node 节点名

移除在指定节点上的pod

kubectl drain node 节点名

以上这两步也可以将指定的工作节点进行常规的状态维护

结束常规的技术维护之后,重新加入K8S调度的指令:

kubectl uncordon node 节点名

3、namespace 和用来进行容器环境隔离的namesapce 不是一个层面的东西

kubectl get //列出指定的资源类型

kubectl get pods // 列出所有的pod资源

kubectl get nodes // 列出所有的节点信息

kubectl get namespace // 所有的名称空间

[root@control ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   3d4h			// 本身默认的名称空间
kube-flannel      Active   3d4h			// 创建flannel 网络插件时,创建的专门用于运行网络插件的名称空间 
kube-node-lease   Active   3d4h			// 管理K8S集群节点有限期,属于默认名称空间
kube-public       Active   3d4h			// 也属于默认的名称空间
kube-system       Active   3d4h		 	// 默认名称空间,K8S核心组件资源

4、label 标签/ annotation 备注

5、taint 污点 toleration 容忍

taint 一般设置在工作节点,用来说明节点的一些不适合运行pod的状态

toleration 一般设置在某个pod上,用来说明可以调度到条件适配的有污点的节点。

6、Service // 使用pod运行的应用一个会认为是一个独立的服务

7、Volume // 卷 pod 使用的存储

8、PersistentVolume // 持久卷

9、Deployment // 服务部署 一次需要调度的pod的数量

10、Secret // K8s 加密数据的访问

11、StatefulSet // 有状态的服务部署 网络资源固定分配以及存储资源的持久化

12、DaemonSet // 无状态的服务部署

13、ServiceAccount // 服务装好

14、ReplicationController // 副本控制器

15、ReplicaSet // 副本集控制器,和上一条功能相同 只是版本不同

16、Job // 一个定时作业

17、CronJob // 一个周期作业

18、SecurityContext // 安全上下文

19、ResourceQuota // 资源配额 容器资源限制

20、LimitRange // 范围限制

21、HorizontalPodAutoscaling // pod水平扩展 一般通过RC RS等资源快速实现

22、Ingress // 集成的应用网关,属于一种网络和应用功能的合并资源

23、ConfigMap // 配置映射,一般用来解决卷和持久卷的映射关系

24、Role // 用来进行用户权限约束的资源 K8S平台中不是通过属主属组进行权限划分,而是通过角色划分用户的权限

25、ClusterRole // 对K8S集群本身管理权限的划分

练习参考资料:

使用 Deployment 运行一个无状态应用 | Kubernetes本文介绍如何通过 Kubernetes Deployment 对象去运行一个应用。教程目标 创建一个 nginx Deployment。 使用 kubectl 列举该 Deployment 的相关信息。 更新该 Deployment。 准备开始 你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:Killercoda 玩转 Kubernetes 你的 Kubernetes 服务器版本必须不低于版本 v1.9. 要获知版本信息,请输入 kubectl version. 创建并了解一个 nginx Deployment 你可以通过创建一个 Kubernetes Deployment 对象来运行一个应用, 且你可以在一个 YAML 文件中描述 Deployment。例如,下面这个 YAML 文件描述了一个运行 nginx:1.14.2 Docker 镜像的 Deployment:application/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 # 告知 Deployment 运行 2 个与该模板匹配的 Pod template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.https://kubernetes.io/zh-cn/docs/tasks/run-application/run-stateless-application-deployment/

部署一个无状态应用到K8S集群

  1. 目前对于无状态应用的部署通过deployment实现,创建一个deployment 会自动选择RS控制器,创建应用副本数量的控制器。

  2. rc 作为一种较早的副本控制器,已经不推荐再继续使用

  3. K8S中的资源不直接通过create 子命令创建,为了更加贴合应用的实际运行环境,K8S对于大部分管理资源的创建都是通过一种叫做声明式配置的文件进行预先配置,然后进行创建。

    [root@control ~]# vim nginx-deployment.yml
    apiVersion: apps/v1 //K8Sapiserver的路径
    kind: Deployment //资源类型 Deployment
    metadata: //针对资源的元数据
    name: nginx-deployment // 设置资源的名称
    spec: // 资源具体的参数
    selector: // 选择器
    matchLabels: // 匹配标签的值
    app: nginx // 设定的值
    replicas: 2 // 告知 Deployment 运行 2 个与该模板匹配的 Pod
    // replicas 副本的控制主要是通过relipcaset
    template: // pod运行的参数
    metadata:
    labels:
    app: nginx // pod 对应的标签
    spec: // pod中容器对应的参数
    containers:
    - name: nginx // 容器名称
    image: nginx:latest // 容器对应的镜像
    imagePullPolicy: IfNotPresent // 镜像的拉取策略为节点中没有
    ports:
    - containerPort: 80 // nginx容器需要使用80端口通信,pod中的其他容器不能使用80端口

上面的配置文件,会创建一个名为nginx的deployment,这个deployment中需要启动两个pod,pod中是一个使用nginx镜像的容器。

为了避免需要拉取镜像,检查工作节点镜像环境。

[root@node1 ~]# crictl -r unix:///var/run/containerd/containerd.sock images nginx

[root@control ~]# kubectl apply -f nginx-deployment.yml
deployment.apps/nginx-deployment created
[root@control ~]# source  .kube/k8s_bash_completion
[root@control ~]# kubectl describe deployments.apps nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Mon, 23 Sep 2024 17:20:07 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:         nginx:latest
    Port:          80/TCP
    Host Port:     0/TCP
    Environment:   <none>
    Mounts:        <none>
  Volumes:         <none>
  Node-Selectors:  <none>
  Tolerations:     <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-bf56f49c (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  69s   deployment-controller  Scaled up replica set nginx-deployment-bf56f49c to 2
[root@control ~]# kubectl get pods
NAME                              READY   STATUS    RESTARTS     AGE
my-nginx-7549dd6888-lhnr6         1/1     Running   1 (9h ago)   3d
my-nginx-7549dd6888-z84x4         1/1     Running   1 (9h ago)   3d
nginx-deployment-bf56f49c-54sxj   1/1     Running   0            3m18s
nginx-deployment-bf56f49c-fjbsc   1/1     Running   0            3m18s
[root@control ~]# kubectl get pods -l app=nginx
NAME                              READY   STATUS    RESTARTS   AGE
nginx-deployment-bf56f49c-54sxj   1/1     Running   0          3m46s
nginx-deployment-bf56f49c-fjbsc   1/1     Running   0          3m46s
[root@control ~]# vim nginx-deployment.yml
[root@control ~]# kubectl apply -f nginx-deployment.yml
deployment.apps/nginx-deployment configured
[root@control ~]# kubectl describe deployments.apps nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Mon, 23 Sep 2024 17:20:07 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:         nginx:latest
    Port:          80/TCP
    Host Port:     0/TCP
    Environment:   <none>
    Mounts:        <none>
  Volumes:         <none>
  Node-Selectors:  <none>
  Tolerations:     <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Progressing    True    NewReplicaSetAvailable
  Available      True    MinimumReplicasAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-bf56f49c (3/3 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  5m41s  deployment-controller  Scaled up replica set nginx-deployment-bf56f49c to 2
  Normal  ScalingReplicaSet  11s    deployment-controller  Scaled up replica set nginx-deployment-bf56f49c to 3 from 2
[root@control ~]# kubectl get pods -l app=nginx
NAME                              READY   STATUS    RESTARTS   AGE
nginx-deployment-bf56f49c-54sxj   1/1     Running   0          5m58s
nginx-deployment-bf56f49c-fjbsc   1/1     Running   0          5m58s
nginx-deployment-bf56f49c-q2fbx   1/1     Running   0          28s
[root@control ~]# kubectl scale --replicas=4 deployment nginx-deployment
deployment.apps/nginx-deployment scaled
[root@control ~]# kubectl get pods -l app=nginx
NAME                              READY   STATUS    RESTARTS   AGE
nginx-deployment-bf56f49c-54sxj   1/1     Running   0          7m7s
nginx-deployment-bf56f49c-fjbsc   1/1     Running   0          7m7s
nginx-deployment-bf56f49c-kfr8g   1/1     Running   0          3s
nginx-deployment-bf56f49c-q2fbx   1/1     Running   0          97s
[root@control ~]# kubectl scale --replicas=2 deployment nginx-deployment
deployment.apps/nginx-deployment scaled
[root@control ~]# kubectl get pods -l app=nginx
NAME                              READY   STATUS    RESTARTS   AGE
nginx-deployment-bf56f49c-54sxj   1/1     Running   0          7m28s
nginx-deployment-bf56f49c-fjbsc   1/1     Running   0          7m28s
[root@control ~]# kubectl delete deployments.apps nginx-deployment
或者使用配置文件删除
[root@control ~]# kubectl delete -f  nginx-deployment.yml
deployment.apps "nginx-deployment" deleted
相关推荐
一直学习永不止步几秒前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数
尘浮生3 分钟前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
lldhsds11 分钟前
书生大模型实战营第四期-入门岛-1. Linux前置基础
linux
尚学教辅学习资料11 分钟前
基于SpringBoot的医药管理系统+LW示例参考
java·spring boot·后端·java毕业设计·医药管理
雷神乐乐27 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|32 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
wowocpp34 分钟前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
山河君1 小时前
ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
linux·ubuntu·语音识别
鹏大师运维1 小时前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos