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 适用于存储敏感信息。通过使用这些资源,您可以将配置与应用程序代码分离,提升应用程序的安全性和可维护性