Kubernetes

1、Kubernetes 主机节点的两种类型

Master节点:
Master 节点主要由 API Server Controller-Manager Scheduler 三个组件,以及一个用于存储 集群状态的 Etcd 存储服务组成
Node节点:
Node 节点则主要包含 Kubelet Kube Proxy 及容器运行时 三个组件,它们承载运行各类应用容器

2、Master 与 Node 节点

Master

API 服务器 (kube-apiserver)

  • 提供 Kubernetes API 的 RESTful 接口,是所有其他组件的前端。
  • 负责验证和配置 Kubernetes 资源数据。

etcd

  • 一个分布式键值存储,用于存储所有集群的配置信息和状态数据。
  • 高可用、可靠,是 Kubernetes 的持久存储后端。

调度器 (kube-scheduler)

  • 负责将新创建的 Pod 分配到适当的工作节点上。
  • 基于资源需求、策略约束、数据局部性等因素进行调度决策。

控制管理器 (kube-controller-manager)

  • 包含多个控制器,用于处理常规后台任务和集群状态管理。
  • 包括节点控制器、复制控制器、端点控制器等。

------------------------------------------------------------------------------------------------------------------------

Node

kubelet

  • 每个节点上运行的主要代理,负责管理节点上的容器。
  • 接受主节点的指令并执行容器操作,确保容器按预期运行。

容器运行时 (Container Runtime)

  • 负责在节点上运行容器,例如 Docker、containerd、CRI-O 等。
  • 提供容器的启动、停止、删除等功能。

kube-proxy

  • 负责为 Kubernetes 服务实现网络代理。
  • 处理 Pod 间的网络通信和负载均衡。

网络插件 (Network Plugin)

  • 管理节点上的网络配置,确保 Pod 间的网络通信。
  • 常用的网络插件包括 Flannel、Calico、Weave 等。

3、集群部署

(1)各节点借助于chronyd服务(程序包名称chrony)设定各节点时间精确同步;

(2)各节点通过DNS完成各节点的主机名称解析;

(3)各节点禁用所有的Swap设备;

(4)各节点禁用默认配置的iptables防火墙服务;

注意:看清各节点和所有主机

1、
[root@k8s-master:~]# systemctl status chrony
● chrony.service - chrony, an NTP client/server
     Loaded: loaded (/lib/systemd/system/chrony.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-03-25 18:54:18 CST; 42min ago

2、
[root@k8s-master:~]# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 ubuntu1

10.0.0.200 k8s-master  kubeapi.magedu.com
10.0.0.201 k8s-node01
10.0.0.202 k8s-node02
10.0.0.203 k8s-node03

3、
[root@k8s-master:~]# swapoff -a  
[root@k8s-master:~]# systemctl --type swap
#将上面命令列出的每个设备,使用systemctl mask命令加以禁用。
[root@k8s-master:~]# systemctl mask SWAP_DEV
[root@k8s-master:~]# free -m
               total        used        free      shared  buff/cache   available
Mem:            3876         297        3146           1         432        3339
Swap:              0           0           0

4、
[root@k8s-master:~]#ufw disable
(5)所有主机配置 cri-dockerd(v1.24 以后版本 )
1、
[root@k8s-master:~]# vim /lib/systemd/system/cri-docker.service
# 修改以下行
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image registry.aliyuncs.com/google_containers/pause:3.9

2、
systemctl daemon-reload && systemctl restart cri-docker.service

3、同步至所有节点
[root@k8s-master:~]# for i in {201..203};do scp /lib/systemd/system/cridocker.service 10.0.0.$i:/lib/systemd/system/cri-docker.service; ssh 10.0.0.$i 
"systemctl daemon-reload && systemctl restart cri-docker.service";done
(6)所有 master node 节点安装 kubeadm 等相关包
[root@k8s-master:~]# export K8S_VERSION=v1.30
[root@k8s-master:~]# export K8S_VERSION=v1.28
[root@k8s-master:~]# curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/${K8S_VERSION}/deb/Release.key |
   gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
[root@k8s-master:~]# echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/${K8S_VERSION}/deb/ /" | tee 
/etc/apt/sources.list.d/kubernetes.list
[root@k8s-master:~]# apt update
[root@k8s-master:~]# apt -y install   kubeadm

(7)在第一个 master 节点运行 kubeadm init 初始化命令

[root@k8s-master:~]# K8S_RELEASE_VERSION=1.22.1
[root@k8s-master:~]# kubeadm init --control-plane-endpoint kubeapi.wang.org --
kubernetes-version=v${K8S_RELEASE_VERSION} --pod-network-cidr 10.244.0.0/16 --
service-cidr 10.96.0.0/12 --image-repository 
registry.aliyuncs.com/google_containers --token-ttl=0 --upload-certs \
--cri-socket=unix:///run/cri-dockerd.sock
这几步骤,master节点已经给出,注意保存,以备之后加入master与node节点
(8)master 节点生成 kubectl 命令的 kube-config 授权文件
(9)添加 node 节点
(10)部署网络插件
(11)查看节点
[root@k8s-master:~]# sudo mkdir .kube
[root@k8s-master:~]# sudo cp /etc/kubernetes/admin.conf .kube/config
[root@k8s-master:~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
#每个工作节点执行
[root@k8s-node01:~]# kubeadm join kubeapi.magedu.com:6443 --token 1timpd.sw6jb4rdf41gtjko --discovery-token-ca-cert-hash sha256:16d4e3bd89e00b6a9d1cd0b9a17bb5fd53d1735cbe1e05bac69f2f4a5545fbd1
#部署网络插件  https://github.com/flannel-io/flannel 以pod形式把flannel部署到集群上
[root@k8s-master:~]# kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
[root@k8s-master:~]# kubectl get nodes
NAME         STATUS   ROLES           AGE     VERSION
k8s-master   Ready    control-plane   26m     v1.29.3
k8s-node01   Ready    <none>          6m49s   v1.29.3
k8s-node02   Ready    <none>          5m25s   v1.29.3
k8s-node03   Ready    <none>          5m22s   v1.29.3

4、工作负载资源

Replica Set

ReplicaSet 确保指定数量的 Pod 副本在任意给定时间运行。它会监控 Pod 的状态,并在 Pod 被删除或崩溃时自动创建新的 Pod 以保持所需的副本数量。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image

Deployment

Deployment 在 ReplicaSet 之上提供了一层更高的抽象,用于声明和管理应用程序的期望状态。它支持滚动更新和回滚机制,可以方便地更新应用程序。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image

DaemonSet

DaemonSet 确保每个(或指定的)节点上运行一个 Pod 实例。常用于运行集群守护进程,例如日志收集器、监控代理等。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-daemonset
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image

Job

Job 创建一个或多个 Pod 并确保它们成功终止,适用于一次性任务或批处理任务。每个 Pod 成功完成其任务后,Job 便会结束。
apiVersion: batch/v1
kind: Job
metadata:
  name: my-job
spec:
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image
      restartPolicy: Never
  backoffLimit: 4

CronJob

CronJob 在指定时间间隔运行 Job,类似于 UNIX 系统上的 cron 表达式,适用于定时任务。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: my-cronjob
spec:
  schedule: "*/5 * * * *"  # 每 5 分钟运行一次
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-container
            image: my-image
          restartPolicy: Never

5、服务访问

Server

Kubernetes 集群提供了这样的一个资源对象 Service ,它定义了一组 Pod 的逻辑集合和一个用于访问它们的入口策略
Service 可以基于标签的方式自动找到对应的 pod 应用,而无需关心 pod ip 地址变化与否,从而实现了类似负载均衡的效果
Endpoints
· 当创建 Service 资源的时候,最重要的就是为 Service 指定能够提供服务的标签选择器 Service Controller 就会根据标签选择器会自动创建一个同名的 Endpoint 资源对象
· Endpoint Controller 使用 Endpoint 的标签选择器 ( 继承自 Service 标签选择器 ) ,筛选符合条件 ( 包括 符合标签选择器条件和处于 Ready 状态 ) pod 资源
· Endpoint Controller 将符合要求的 pod 资源绑定到 Endpoint 上,并告知给 Service 资源谁可以正常 提供服务 Service 会自动获取一个固定的 cluster IP 向外提供由 Endpoint 提供的服务资源

ClusterIP Service:ClusterIP是一种内部服务类型,用于在集群内部暴露服务。ClusterIP服务会为服务分配一个集群内部的IP地址,Pod可以通过该IP地址访问服务

NodePort Service:NodePort是一种服务类型,用于将服务暴露在每个节点的某个端口上,这样集群外部的客户端可以通过节点的IP地址和端口号访问服务

LoadBalancer Service:LoadBalancer服务类型用于将服务暴露到外部,使得外部客户端可以通过负载均衡器访问服务
# ClusterIP Service 实现

apiVersion: v1
kind: Service
metadata:
  name: my-clusterip-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
# NodePort Service 实现
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30007  # 可选。如果不指定,Kubernetes会自动分配一个端口。
# LoadBalancer Service 实现
apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

CoreDNS

CoreDNS 是一个灵活和可扩展的 DNS 服务器,通常用作 Kubernetes 集群的 DNS 服务。它在 Kubernetes 中充当集群内部的 DNS 提供者,使 Pod 可以通过服务名进行相互通信

6、存储机制

存储机制是管理应用程序持久化数据的重要组成部分

EmptyDir

mptyDir 是一种临时性的存储,随着 Pod 的生命周期而存在。它适合于需要在同一个 Pod 中
的多个容器之间共享文件的场景,或者用作临时存储的简单需求
apiVersion: v1
kind: Pod
metadata:
  name: emptydir-example
spec:
  containers:
    - name: test-container1
      image: nginx
      volumeMounts:
        - name: shared-data
          mountPath: /data
    - name: test-container2
      image: busybox
      volumeMounts:
        - name: shared-data
          mountPath: /data
  volumes:
    - name: shared-data
      emptyDir: {}

 HostPath

HostPath 允许 Pod 直接访问节点(Node)上的文件系统路径。它提供了一种简单的方式来将节点上的文件或目录挂载到 Pod 中,通常用于开发和测试环境
apiVersion: v1
kind: Pod
metadata:
  name: hostpath-example
spec:
  containers:
    - name: test-container
      image: nginx
      volumeMounts:
        - name: hostpath-data
          mountPath: /data
  volumes:

PV、PVC

PersistentVolume (PV):PV 是集群中的存储资源,它是集群管理员预先配置的存储卷。

PersistentVolumeClaim (PVC):PVC 是 Pod 对 PV 请求的声明,Pod 通过 PVC 来获取所需的存储资源

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim-example
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: pv-pod-example
spec:
  containers:
    - name: test-container
      image: nginx
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: pv-claim-example

StorageClass

StorageClass的主要作用是为Pod提供动态分配存储卷(Persistent Volume)的能力。它为应用程序开发人员和管理员提供了一种统一的方式来请求持久存储资源,而无需关心底层存储的具体细节
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2

总结

多种灵活的存储解决方案,从临时存储到持久化存储,以及针对不同工作负载和需求的定制化存储策略   这些存储机制允许开发人员和管理员根据应用程序的要求选择最合适的存储方式,从而提升应用的可靠性和扩展性

7、配置管理

配置管理是一项重要的功能,用于将配置信息与应用程序代码分离,以便更好地管理和维护应用程序

ConfigMap

ConfigMap 用于存储非机密的配置信息,如配置文件、环境变量和命令行参数等。ConfigMap是一种键值对存储,可以在 Pod 中以环境变量、命令行参数或挂载卷的形式使用

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: my-config  # 指定 configMap

Secret

Secret 用于存储敏感信息,如密码、OAuth 令牌和 SSH 密钥等。与 ConfigMap 类似,Secret 也是一种键值对存储 

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secret
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret

总结

ConfigMap 和 Secret 是 Kubernetes 中用于配置管理的两种主要资源类型。ConfigMap 适用于存储非敏感的配置信息,而 Secret 适用于存储敏感信息。通过使用这些资源,您可以将配置与应用程序代码分离,提升应用程序的安全性和可维护性

                                                                                                                       写的不好,请多多指教
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宏运维有点菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值