一、K8S简介
Kubernetes(简称k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了资源调度、部署管理、服务发现、扩容缩容、监控,维护等一整套功能。努力成为跨主机集群的自动部署、扩展以及运行应用程序容器的平台。 它支持一系列容器工具, 包括Docker等。
kubernetes的特点:
•可移植:支持公有云,私有云,混合云,多重云(multi-cloud)
•可扩展::模块化, 插件化, 可挂载, 可组合
•自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展,自我修复
•服务发现和负载均衡
二、k8s架构和组件

Kubernetes主要由以下核心组件组成:
- etcd保存了整个集群的状态,配置数据以及有关集群状态的信息位于 etcd(一个键值存储数据库)中。etcd 采用分布式、容错设计,被视为集群的最终事实来源。
- kube-apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
- kube-controller-manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
- kube-scheduler负责资源的调度,接收ApiServer创建Pod的请求,为Pod选择一个合适的Node,由该Node上的kubelet启动Pod中的相应容器
- kubelet负责本Node节点上的Pod的创建、修改、监控、删除等生命周期管理,同时Kubelet定时“上报”本Node的状态信息到Api Server里
- kube-proxy负责为Service提供cluster内部的服务发现和负载均衡
处理流程:
1、用户请求:通过kubectl命令行工具或API接口提交一个Pod的定义,通常是通过YAML或JSON格式的配置文件来描述Pod的详细信息,包括容器镜像、环境变量、资源需求、卷挂载等。
2、kube-apiserver接收:请求首先到达Kubernetes的kube-apiserver,kube-apiserver会对请求进行认证、授权和准入控制检查。
3、持久化存储到etcd:kube-apiserver验证了请求的有效性,它会将Pod的定义信息写入etcd(分布式键值存储),以确保集群内的所有组件都能获取最新的集群状态
4、kube-scheduler调度决策:当Pod被创建并保存到etcd后,kube-apiserver会触发调度器(scheduler)对Pod进行调度,调度器根据集群节点的资源状况、亲和性和反亲和性规则以及其他约束条件,选择一个最适合运行Pod的Node
5、绑定Pod到Node:kube-scheduler将调度决定通知给kube-apiserver,由kube-apiserver将Pod与选定的Node进行绑定
6、kubelet执行:绑定的节点上的kubelet进程通过监听kube-apiserver的事件,得知需要在其上创建新的Pod,那么kubelet从etcd中获取该Pod的详细信息,然后开始执行创建Pod的具体工作,例如下载容器镜像,创建网络命名空间和网络策略,设置数据卷以及启动pod的容器
7、pod的就绪和运行:当pod内的所有容器都成功的启动并通过了就绪探针的检测,那么kubelet会将pod的状态汇报到kube-apiserver,标记pod的状态为“running”状态,那么此时pod就可以接收来自service的流量
8、持续监控和管理:在pod的生命周期内,kubelet和kube-apiserver会持续监测pod的状态,并根据pod的定义和系统策略进行对应的管理和维护操作
三、k8s搭建
搭建一个简单的一主两从的k8s小集群:
1、环境规划
| 版本说明 | |||
| 软件 | 版本 | ||
| 操作系统 | CentOS-7-x86 | ||
| Docker | 26.1.4 | ||
| Kubernetes | 1.23.0 | ||
| 集群规划 | |||
| Hostname | IP | 规格 | 安装组件 |
| k8s-master | 47.238.72.60 | 2C4G | kubelet kube-apiserver kube-controller-manager kube-schedule kube-proxy |
| k8s-node1 | 47.238.65.218 | 2C2G | kubelet kube-proxy |
| k8s-node2 | 47.238.78.15 | 2C2G | kubelet kube-proxy |
下述操作所有节点均需执行!!
2、修改服务器hostname
①hostnamectl set-hostname xxx(定义的主机名)
②执行:bash 生效
3、修改hosts (简化配置,确保各节点(包括 master 节点和 worker 节点)之间能够通过网络相互通信)
cat >> /etc/hosts << EOF
xxxxxx k8s-master
xxxxxx k8s-node1
xxxxxx k8s-node2
EOF
例如:
47.238.72.60 k8s-master
47.238.65.218 k8s-node1
47.238.78.15 k8s-node2
4、关闭swap分区(Kubernetes 使用 kubelet 来管理节点上的资源,Swap 可能导致节点内存使用情况变得不可预测,因为操作系统可以将内存页交换到磁盘上,影响性能和应用程序的响应时间)
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
5、关闭防火墙(防火墙可能阻止 Kubernetes 集群节点之间所需的网络流量,例如 API server 的流量、网络插件的流量)
systemctl stop firewalld && systemctl disable firewalld
6、关闭SELinux (SELinux提供了强制访问控制,但它可能与 Kubernetes 的某些操作和容器化应用不兼容,导致权限问题或功能受限)
setenforce 0 && sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
7、开启 ipvs(启用 IPVS 可以提高 Kubernetes Service 的网络性能,提供更高的吞吐量和更低的延迟)
①yum -y install ipset ipvsadm
②
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
③chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4 (避免权限问题)
8、统一时区
①yum install -y ntpdate
②ntpdate time.windows.com
9、部署docker容器
yum -y update
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
启动容器:systemctl start docker && systemctl enable docker
10、创建并配置镜像下载加速器
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://wrx01hg3.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker
11、安装阿里云的 YUM 软件源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=kubernetes-yum-repos-kubernetes-el7-x86_64安装包下载_开源镜像站-阿里云
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
12、安装 kubeadm, kubelet 和 kubectl
①
yum update -y
yum install -y kubelet-xxx kubeadm-xxx kubectl-xxx(版本可根据需求选择)
②
systemctl enable kubelet
systemctl start kubelet
版本信息:https://v1-30.docs.kubernetes.io/zh-cn/docs/concepts/overview/components/

四、k8s初始化和网络插件
在master节点上操作:
1、集群初始化(红色需要变更为实际服务器的配置):
kubeadm init \
--apiserver-advertise-address=xxxx \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
| --apiserver-advertise-address=xxxx: 指定 Kubernetes API 服务器应该广告的 IP 地址。这个地址通常是 master 节点的 IP 地址(但是在验证过程中,需要修改为master的私有地址,即需要查看机器的网卡绑定的IP)。其他节点将通过这个地址与 API 服务器通信。 指定一个替代的镜像仓库地址。由于中国大陆的网络原因,直接访问 Google 的镜像仓库可能很慢或无法访问,因此很多用户选择使用国内的镜像,比如阿里云的仓库,以加速镜像下载。 指定要安装的 Kubernetes 的版本。这个选项确保你安装的是指定的版本。这在你需要特定版本功能或与其他软件兼容时尤其有用。 定义 Kubernetes 内部虚拟网络中的服务 IP 地址范围。这个网段中的 IP 地址用于分配给 Kubernetes 服务。 指定 Pod 网络的 IP 地址范围。这个 IP 网段用于分配给在集群中运行的 Pod。通常需要与所使用的网络插件(如 Flannel、Calico)的配置相匹配。比如,Flannel 的默认配置通常使用 10.244.0.0/16。 |
例如:

kubeadm init \
--apiserver-advertise-address=172.17.163.133 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

节点上执行后,此时节点加入集群中:
(在实际安装中,有可能会出现docker的网桥划分不对,导致节点一直无法加入集群,此时需要修改/etc/hosts的配置文件)

加入后的情况,此时容器内的网络通信并不通

2、安装网络插件Flannel
PS:主要作用是在集群中的各个节点之间提供一个扁平的、互相连通的网络环境,使得运行在不同节点上的容器可以通过 IP 地址直接进行通信
wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml获取flannel的yaml文件

kubectl apply -f kube-flannel.yml

等待几分钟后,全部变成ready,此时k8s算是搭建完成

五、K8s创建微服务
简单的创建一个nginx的服务器为例:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: nginx-test
labels:
app: nginx-pod
spec:
restartPolicy: Always
containers:
- name: nginx-web
image: nginx:latest
ports:
- containerPort: 80
protocol: TCP
imagePullPolicy: Always
resources:
requests:
cpu: 0.1
memory: 100Mi
limits:
cpu: 0.1
memory: 100Mi
执行如上资源清单,会创建对应的pod
kubectl apply -f nginx-pod.yaml
kubectl get pods -n nginx-test -owide

2、使用service的nodeport方式将端口暴漏给外部访问(集群内的网络,外部是无法访问的)
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: nginx-test
spec:
selector:
app: nginx-pod
ports:
- port: 80
targetPort: 80
protocol: TCP
type: NodePort
执行如上资源清单,会创建对应的svc以及可以看到svc通过nodeport暴漏出去的外部访问端口
kubectl apply -f service.yaml
kubectl get svc -n nginx-test -owide

上述服务都完成后,就可以通过公网ip+端口进行访问


4万+

被折叠的 条评论
为什么被折叠?



