当前位置: 首页 > news >正文

从零到一:Kubernetes 基础概念与集群部署详解

  • 作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
  • 座右铭:   云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
  • 个人主页:团儿.-CSDN博客

前言:

在当今瞬息万变的数字时代,应用的需求正推动着基础设施的革新。我们早已告别了将应用monolithic 地部署在单一服务器的时代,转而进入了以容器微服务为标志的云原生纪元。容器技术带来了环境的一致性与部署的敏捷性,但随之而来的是一个全新的挑战:如何高效、可靠地管理成百上千个在分布式环境中运行的容器?如何确保它们能够无缝协作、快速自愈并轻松扩展?

正是在这样的背景下,Kubernetes(常简称为K8s) 而生,并迅速确立了其作为容器编排领域事实标准的地位。

因此,本文的旅程将从根基开始。我将首先系统地剖析Kubernetes的核心架构与基本概念,带您清晰地认识:

  • 控制平面(Control Plane) 的各个组件(如kube-apiserver、etcd、kube-scheduler、kube-controller-manager)如何共同决策,管理集群的全局状态。

  • 工作节点(Node) 上的关键守护进程(如kubelet、kube-proxy、容器运行时)如何忠实地执行指令,确保您的应用稳定运行。

  • 核心抽象对象 如Pod、Service、ConfigMap等,如何将复杂的运维需求抽象为易于理解和操作的声明式配置。

理论的价值在于指导实践,我将一步步引导您完成一个完整的Kubernetes集群的部署。

现在,请让我们一同开启这段旅程,从理清Kubernetes的基本脉络开始,直至亲手搭建并驾驭您的第一个容器集群,迈出成为云原生实践者的坚实一步。


正文:

一.基本概念及组件

Kubernetes这个单词来自于希腊语,含义是 舵手 或 领航员;

生产环境级别的容器编排

编排是什么意思:

1. 按照一定的目的依次排列;

2. 调配、安排;

Kubernetes,也称为K8S,其中8是代表中间“ubernete”的8个字符,是Google在2014年开源的一个容器编排引擎,用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便于管理和发现,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,很多细节都不需要运维人员去进行复杂的手工配置和处理;

Kubernetes拥有Google在生产环境上borg 15年运行的经验,并结合了社区中最佳实践;

K8S是 CNCF 的项目,本来Kubernetes是Google的内部项目,后来开源出来,又后来为了其茁壮成长,捐给了CNCF;

CNCF全称Cloud Native Computing Foundation(云原生计算基金会)

官网:https://kubernetes.io/

中文社区:https://www.kubernetes.org.cn/k8s

代码:https://github.com/kubernetes/kubernetes

Kubernetes是采用Go语言开发的,Go语言是谷歌2009发布的一款开源编程语言;


二.k8s整体结构

Master:

k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;

Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller ManagerServer 所组成;

Nodes:

集群工作节点,运行用户业务应用容器;

Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime);

k8s网络通讯模式---flannel---pod---etcd

k8s组件及流程架构:

┌─────────────────────────────────────────────────────────────────┐

│                        CLIENTS                                   │

│    kubectl | Dashboard | API调用 | 其他工具                        │

└───────────────────────────┬─────────────────────────────────────┘

                            │

┌───────────────────────────▼─────────────────────────────────────┐

│                      MASTER NODE                                 │

│  ┌─────────────────────────────────────────────────────────────┐ │

│  │                     API Server                              │ │

│  │    ● 统一RESTful API入口                                    │ │

│  │    ● 认证、授权、验证                                        │ │

│  │    ● 所有组件通信枢纽                                        │ │

│  └─────────────┬───────────────────────────────┬───────────────┘ │

│                │                               │                 │

│  ┌─────────────▼─────────────┐ ┌───────────────▼─────────────┐   │

│  │     Controller Manager    │ │         Scheduler          │   │

│  │ ● Node Controller         │ │ ● 监听未调度Pod            │   │

│  │ ● Replication Controller  │ │ ● 选择最优Node            │   │

│  │ ● Endpoints Controller    │ │ ● 考虑负载、亲和性等        │   │

│  │ ● Namespace Controller    │ │                           │   │

│  └───────────────────────────┘ └───────────────────────────┘   │

│                                                                 │

│  ┌─────────────────────────────────────────────────────────────┐ │

│  │                         Etcd                                │ │

│  │    ● 集群状态存储                                           │ │

│  │    ● 配置信息持久化                                         │ │

│  │    ● 数据变更通知                                           │ │

│  └─────────────────────────────────────────────────────────────┘ │

└─────────────────────────────────────────────────────────────────┘

                                      │

                                      │ 调度指令、状态上报

                                      │

┌─────────────────────────────────────▼─────────────────────────────┐

│                         WORKER NODES                              │

│  ┌─────────────────────────────────────────────────────────────┐ │

│  │                        Node 1                               │ │

│  │  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────┐  │ │

│  │  │     Kubelet     │  │   kube-proxy    │  │   Pod       │  │ │

│  │  │ ● 管理Pod生命周期│  │ ● Service代理    │  │ ┌─────────┐ │  │ │

│  │  │ ● 状态上报      │  │ ● 负载均衡       │  │ │ Container│ │  │ │

│  │  │ ● 容器健康检查  │  │ ● 网络规则       │  │ └─────────┘ │  │ │

│  │  └─────────────────┘  └─────────────────┘  └─────────────┘  │ │

│  └─────────────────────────────────────────────────────────────┘ │

│                                                                   │

│  ┌─────────────────────────────────────────────────────────────┐ │

│  │                        Node 2                               │ │

│  │  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────┐  │ │

│  │  │     Kubelet     │  │   kube-proxy    │  │   Pod       │  │ │

│  │  │ ● 管理Pod生命周期│  │ ● Service代理    │  │ ┌─────────┐ │  │ │

│  │  │ ● 状态上报      │  │ ● 负载均衡       │  │ │ Container│ │  │ │

│  │  │ ● 容器健康检查  │  │ ● 网络规则       │  │ └─────────┘ │  │ │

│  │  └─────────────────┘  └─────────────────┘  └─────────────┘  │ │

│  └─────────────────────────────────────────────────────────────┘ │

└─────────────────────────────────────────────────────────────────┘

核心网络与服务发现:

┌─────────────────────────────────────────────────────────────────┐

│                    NETWORK & SERVICE LAYER                      │

│                                                                 │

│  ┌─────────────────┐    ┌─────────────────┐    ┌─────────────┐  │

│  │    Flannel      │    │    CoreDNS      │    │  Ingress    │  │

│  │ ● Pod网络 overlay │  │ ● 服务发现      │  │ ● 7层负载均衡 │  │

│  │ ● 跨主机通信     │  │ ● DNS解析        │  │ ● HTTP路由    │  │

│  │ ● CNI插件        │  │ ● 集群内部域名   │  │ ● SSL终止     │  │

│  └─────────────────┘    └─────────────────┘    └─────────────┘  │

└─────────────────────────────────────────────────────────────────┘

例:

创建pod流程:

用户(kubectl) → API Server → Etcd(存储)

    → Scheduler(监听) → API Server → Etcd(更新调度信息)

    → 目标Node的Kubelet(监听) → Docker → 创建容器

→ Kubelet → API Server → Etcd(状态更新)

Service访问流程:

客户端 → Service VIP → kube-proxy → iptables/ipvs规则

→ 后端Pod(负载均衡) → 容器应用

服务发现流程:

Pod应用 → CoreDNS → 解析Service域名 → Service IP

→ kube-proxy → 后端Pod

组件:

kubectl: k8s是命令行端,用来发送客户的操作指令。

API server: 是k8s 集群的前端接口,各种客户端工具以及k8s的其他组件可以通过它管理k8s集群的各种资源。它提供了HTTP/HTTPS RESTful API,即K8S API。是所有服务访问的统一入口。

Scheduler: 负责决定将Pod放在哪个Node上运行。在调度时,会充分考虑集群的拓扑结构,当前各个节点的负载情况,以及应对高可用、性能、数据亲和性和需求。负责介绍任务,选择合适的节点进行分配任务。

Controller Manager: 负责管理集群的各种资源,保证资源处于预期的状态,用来维持副本期望数量。它由多种Controller 组成,包括Replication Controller维护副本数量即期望值,创建删除pod、Endpoints Controller、Namespace Controller、Serviceaccounts Controller等等。

Etcd: 键值对数据库 存储k8s集群所有重要信息(持久化),负责保存k8s集群的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速的通知k8s相关组件。第三方组件,它有可替换方案 Consul、zookeeper。

Etcd的官方将它定位成一个**可信赖**(天生支持集群化)的**分布式键值存储服务**(k-v结构),能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。

V2版本会把所有数据写入到内存中,关机后数据丢失

V3版本会做本地持久化,写入到本地存储。

Kubelet: 它是Node的agent(代理),当Scheduler确定某个Node上运行Pod之后,会将Pod的具体配置信息发送给该节点的kubelet,kubelet会根据这些信息创建和运行容器,并向Master报告运行状态。管理(增删改查)Pod.

kube-proxy: 负责将访问service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。

COREDNS: 可以为集群中的SVC创建一个域名IP的对应关系解析

DASEBORD: 给k8s提供一个B/S结构的UI界面。

INGRESS Crontroller:官方只能实现4层负载均衡,它可以实现7层负载均衡。

Pod:k8s集群的最小组成单位。一个Pod内,可以运行一个或多个容器。大多数情况下,一个Pod内只有一个Container容器。

Flannel: 是k8s集群网路方案,可以保证Pod的跨主机通信。第三方解决方案,也有替换方案。

服务分类:

有状态服务:DBMS数据库管理系统(MYSQL)从pod中剔除后,再恢复就会造成数据丢失。

无状态服务:LVS APACHE NGINX

对docker来说更适合运行无状态服务,对k8s来说目标就是可以运行好有状态服务


三.架构:

从borg到k8s

BorgMaster专门负责请求分发类似大脑,而工作节点是由Borglet负责提供(容器,计算,服务等等),上述都有多个副本3,5,7,9可以防止选举出现双数导致的问题。

提供了多种访问方式,浏览器,命令行,文件------->BrogMaster-------->scheduler(调度器)写入paxos数据库存储,并进行监听,如果发现请求就进入消费环节。

k8s特点:

轻量级:消耗资源小       开源     弹性伸缩        负载均衡:iptables  ipvs

部署 Kubernetes 环境(集群)主要有多种方式:

(1)minikube

minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便您可以试用Kubernetes或进行日常开发工作;

https://kubernetes.io/docs/tutorials/hello-minikube/

(2)kind

Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker;

https://kind.sigs.k8s.io/

(3)kubeadm

Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;

官方地址:

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

(4)二进制包

从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是能让你对各个组件有更清晰的认识;

(5)yum安装

通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老了,所以这种方式用得也比较少了;

(6)第三方工具

有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;

(7)花钱购买

直接购买类似阿里云这样的公有云平台k8s,一键搞定;


四.环境部署

切记    docker与k8s版本必须一致!!!

1.基本环境准备

Centos7.8   双核   4G/node

2.更改主机名

hostnamectl set-hostname masterhostnamectl set-hostname node01hostnamectl set-hostname node02

3.添加对应域名解析

cat >> /etc/hosts << EOF192.168.8.20 master192.168.8.30 node01192.168.8.40 node02EOF

4.禁用防火墙、SElinux

systemctl stop firewalldsystemctl disable firewalldsetenforce 0sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

5.时间同步

timedatectl set-timezone Asia/Shanghai;timedatectl set-local-rtc 0

6.禁用swap

swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab      free -h 

查看禁用效果

7.配置集群无密登录 master到node01,node02无密码

ssh-keygen -t rsassh-copy-id root@node01ssh-copy-id root@node02

8.优化内核参数

Master:
modprobe br_netfiltercat > /etc/sysctl.d/kubernetes.conf << EOFnet.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward = 1net.ipv4.tcp_tw_recycle = 0vm.swappiness = 0vm.overcommit_memory = 1vm.panic_on_oom = 0fs.inotify.max_user_instances = 8192fs.inotify.max_user_watches = 1048576fs.file-max = 52706963fs.nr_open = 52706963net.ipv6.conf.all.disable_ipv6 = 1net.netfilter.nf_conntrack_max = 2310720EOF
sysctl -p /etc/sysctl.d/kubernetes.conf
Master:
scp /etc/sysctl.d/kubernetes.conf node01:/etc/sysctl.d/scp /etc/sysctl.d/kubernetes.conf node02:/etc/sysctl.d/
Node01:
sysctl -p /etc/sysctl.d/kubernetes.conf
Node02:
sysctl -p /etc/sysctl.d/kubernetes.conf

9.基本环境完成,需要在各节点准备k8s的yum源     (推荐阿里云yum源)

Master:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF

10.部署k8s组件

** master节点部署了kubectl、kubelet、kubeadm三个组件,当然在部署前要指定和k8s版本一致的组件版本。

yum install kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 -y --nogpgchecksystemctl start kubeletsystemctl enable kubelet

注:阿里源安装时,需要添加--nogpgcheck参数

//node节点只需部署kubelet-1.18.0 kubeadm-1.18.0即可

### 更改docker默认Cgroup驱动

在/etc/docker/daemon.json文件中,添加一句话即可,当然这个和我们的设置加速器写在一起了。

cat > /etc/docker/daemon.json << EOF{"registry-mirrors": ["https://docker.m.daocloud.io","https://luzxy6tp.mirror.aliyuncs.com","https://hub.uuuadc.top","https://docker.anyhub.us.kg","https://dockerhub.jobcher.com","https://dockerhub.icu","https://docker.ckyl.me","https://docker.awsl9527.cn"],"exec-opts": ["native.cgroupdriver=systemd"]}EOFsystemctl daemon-reloadsystemctl restart docker

> PS: 不要忘了重新加载以及重启doker

11.Kubeadm初始化:

至此,准备工作做完,可以开始初始化,可是由于国内网络环境限制,我们不能直接从谷歌的镜像站下载镜像,有两种方法可以解决,第一种:需要我们手动从docker镜像站下载镜像,然后重新命名,也可以用脚本来实现。这里我们采用第二种:在初始化k8s的时候,指定镜像源为阿里云。

初始化时指定镜像仓库为阿里云

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

或者还有其他方案将k8s集群状态配置问一个yaml文件,然后从yaml文件初始化

kubeadm config print init-defaults > kubeadm-config.yamlvim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2bootstrapTokens:- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authenticationkind: InitConfigurationlocalAPIEndpoint:advertiseAddress: 192.168.8.20bindPort: 6443nodeRegistration:criSocket: /var/run/dockershim.sockname: mastertaints:- effect: NoSchedulekey: node-role.kubernetes.io/master
apiServer:timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta2certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}dns:type: CoreDNSetcd:local:dataDir: /var/lib/etcdimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containerskind: ClusterConfigurationkubernetesVersion: v1.18.0networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12podSubnet: 10.244.0.0/16scheduler: {}
apiVersion: kubeproxy.config.k8s.io/v1alpha1kind: KubeProxyConfigurationmode: "ipvs"
//初始化集群

注:可以提前导入镜像

master节点:
docker load -i etcd.tardocker load -i quay.io-flannel.tardocker load -i kube-apiserver.tardocker load -i kube-controller-manager.tardocker load -i kube-proxy.tardocker load -i kube-scheduler.tardocker load -i kube-webhook.tardocker load -i coredns.tardocker load -i pause.tardocker load -i flannel-plugin.tar
node节点:
docker load -i pause.tardocker load -i kube-proxy.tardocker load -i quay.io-flannel.tardocker load -i flannel-plugin.tar
kubeadm init --config=kubeadm-config.yaml
成功后会有提示:
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configkubeadm join 192.168.8.90:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:a2ec410cea22ef589a7af6072008fbace244a9106bde030e771e9d933124ceec

> PS: 结果做一个保存

systemctl enable kubelet
查看节点:
Kubectl get nodes

此时查看master状态是未就绪(NotReady**),之所以是这种状态是因为还缺少一个附件**flannel**,没有网络各Pod是无法通信的

//添加网络组件(flannel),组件flannel可以通过https://github.com/coreos/flannel中获取

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
再次查看

以上是主节点的安装部署,然后个node节点的安装,和加入集群,这里注意,验证,node节点已经准备好了相关的镜像。

kubeadm join 192.168.8.20:6443 --token njus35.kw3hxkys3urmnuob --discovery-token-ca-cert-hash sha256:05761b73b571c18eebd6972fb70323cd3c4d8e0aa7514efa2680411310424184

node节点需要几个镜像,可以手动先下载一下,或者从master节点同步

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0docker pull quay.io/coreos/flannel:v0.15.1docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2

等待一会去master节点验证。等待的是同步flannel网络。

设置kubectl命令行工具自动补全功能
yum install -y bash-completionsource /usr/share/bash-completion/bash_completionsource <(kubectl completion bash)echo "source <(kubectl completion bash)" >> ~/.bashrc
为了以后我们写yaml文件方便些,这里设置tab键空格个数

Master:

vim .vimrcset tabstop=2
source .vimrc
在master验证k8s组件 如下所示代表安装组件完整且是running状态

**记得三台节点最后要执行systemctl enable kubelet 忘记的集群就启动不了


五.Kubernetes部署“容器化应用”

在Kubernetes集群中部署一个Nginx :

kubectl create deployment nginx --image=nginx:1.17kubectl expose deployment nginx --port=80 --type=NodePortkubectl get pod,svc -o widekubectl get deploymentkubectl scale deployment nginx --replicas=3kubectl describe deployment nginx (查看)kubectl describe pod nginx-

访问地址:

http://NodeIP:Port

在Kubernetes集群中部署一个Tomcat :

kubectl create deployment tomcat --image=tomcatkubectl expose deployment tomcat --port=8080 --type=NodePort

访问地址:

http://NodeIP:Port

K8s部署微服务(springboot程序):

1、项目打包(jar、war)-->可以采用一些工具git、maven、jenkins

2、制作Dockerfile文件,生成镜像;

3、kubectl create deployment nginx --image= 你的镜像

4、你的springboot就部署好了,是以docker容器的方式运行在pod里面的


六.kuboard:

k8s图形化管理工具

网站:

https://kuboard.cn

安装:使用华为源

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml

查看部署情况:

kubectl get pod -n kuboard

(-n命名空间  就是namespace)

部署后访问:

http://192.168.8.20:30080

用户名: admin

密码: Kuboard123

添加k8s集群


期待您的关注~

http://www.dtcms.com/a/570343.html

相关文章:

  • 如何优化SQL查询性能?测试与开发协同优化指南
  • 衡水安徽网站建设网站建设需要注意什么 知乎
  • 手机怎么制作网站教程视频犀牛云做网站怎么样
  • 苏州建设网站wordpress页面编辑插件
  • 学习Java第五十九天——MySQL篇
  • 公司网站搭建费用用上网做任务的网站
  • 甘肃省城乡与建设厅网站首页关键词是在网站后台做的吗
  • 营销印刷网站wordpress模板网站标题重复
  • 室内空间设计网站推荐开网店需要什么准备
  • 烟台城乡建设学校网站开发公司支付前期物业开办费包括哪些内容
  • 【仓颉纪元】仓颉三方库适配深度实战:7 天打通 SQLite 生态壁垒
  • 电源完整性07-如何确定PDN网络中的大电容
  • Java - 使用虹软人脸识别sdk记录
  • 江门网页建站模板慧算账代理记账公司
  • 做非法网站宿迁558网络专业做网站
  • 长沙销售公司 网站余姚的网站建设
  • 网站建设服务商排行wordpress主题没法用
  • 贵港网站建设培训wordpress event calendar
  • 室内装饰公司网站模板贵州新农村建设专业网站
  • 北京网站开发优选ls20227医院网站建设系统
  • 厦门专门建设网站的公司深圳微信商城网站设计联系电话
  • MCU单片机TWS耳机充电盒系统控制方案
  • 8.DSP学习记录之ePWM
  • 钓鱼网站在线下载国外有没有做问卷调查的网站
  • 住房城乡住房和城乡建设部网站首页如何做好一个企业网站设计
  • 旅游景区英文网站建设研究大神自己做的下载音乐的网站
  • 网站上传不了照片做网站的模板
  • 怎么做微信辅助的网站海淀重庆网站建设
  • 做网上贸易哪个网站好网络推广员的工作内容
  • PostIn零基础学习 - 如何使用接口Mock尽早满足前端开发需求