部署kubernetes集群

一、kubernetes概述

Kubernetes,词根源于希腊语的舵手、飞行员。在国内又称k8s(因为k和s之间有8个字母,所以得名。“国内程序员的幽默”)。用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群,是一个生态极其丰富的容器编排框架工具

K8S用于容器化应用程序的部署,扩展和管理。

K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现停一系列功能。
Kubernetes目标是让部署容器化应用简单高效。

官方网站:https://kubernetes.io/
在这里插入图片描述

1.1 kubernetes集群架构与组件

Kubernetes 组件
K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点

在 K8S 中,主节点一般被称为 Master 节点,而从节点则被称为 Worker Node 节点,每个 Node 都会被 Master 分配一些工作负载

Master 组件可以在群集中的任何计算机上运行,但建议 Master 节点占据一个独立的服务器。因为 Master 是整个集群的大脑,如果 Master 所在节点宕机或不可用,那么所有的控制命令都将失效。除了 Master,在 K8S 集群中的其他机器被称为 Worker Node 节点,当某个 Node 宕机时,其上的工作负载会被 Master 自动转移到其他节点上去。

1、master 核心组件

Kube-apiserver
用于暴露kubernetes API,任何资源请求或调用操作都是通过kube-apiserver提供的接口进行

以HTTP Restful API提供接口服务,所有对象资源的增删改查和监听操作都交给API Server处理后再提交给Etcd存储

可以理解成API Server是K8S的请求入口服务。API Server负责接收K8S所有请求(来自UI界面或者CLI命令行工具),然后根据用户的具体请求,去通知其他组件干活。可以说API Server是K8S集群架构的大脑

Kube-controller-manager
运行管理控制,是K8S集群中处理常规任务的后台线程,是K8S集群里所有资源对象的自动化控制中心

在K8S集群中,一个资源对应一个控制器,而Controller manager就是负责管理这些控制器的

由一系列控制器组成,通过API Server监控整个集群的状态,并确保集群处于预期的工作状态,比如当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态

Endpoints Controller
填充端点对象(即连接Services和Pods),负责监听Service和对应的Pod副本的变化。可以理解端点是一个服务暴露出来的访问点,如果需要访问一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的endpoint

控制器作用
节点控制器(Node Controller)负责在节点出现故障时进行通知和响应
副本控制器(Replication Controller)负责为系统中的每个副本控制器对象维护正确数量的 Pod。
端点控制器(Endpoints Controller)填充端点(Endpoints)对象(即加入 Service 与 Pod)
服务帐户和令牌控制器(Service Account & Token Controllers)为新的命名空间创建默认帐户和 API 访问令牌

kube-scheduler
是负责资源调度的进程,根据调度算法为新创建的Pod选择一份合适的Node节点。 可以理解成K8S所有Node节点的调度器。当用于要部署服务时,Scheduler会根据调度算法选择最合适的Node节点来部署Pod。

2、node 核心组件

Kubelet
Node 节点的监视器,以及与 Master 节点的通讯器。Kubelet 是 Master 节点安插在 Node 节点上的“眼线”,它会定时向 API Server 汇报自己 Node 节点上运行的服务的状态,并接受来自 Master 节点的指示采取调整措施

从 Master 节点获取自己节点上 Pod 的期望状态(比如运行什么容器、运行的副本数量、网络或者存储如何配置等), 直接跟容器引擎交互实现容器的生命周期管理,如果自己节点上 Pod 的状态与期望状态不一致,则调用对应的容器平台接口(即 docker 的接口)达到这个状态

管理镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源

总之,在 Kubernetes 集群中,在每个 Node(又称 Worker Node)上都会启动一个 kubelet 服务进程。该进程用于处理 Master 下发到本节点的任务,管理 Pod 及 Pod 中的容器。每个 kubelet 进程都会在 API Server 上注册节点自身的信息,定期向 Master 汇报节点资源的使用情况,并通过 cAdvisor 监控容器和节点资源

Kube-Proxy
在每个 Node 节点上实现 Pod 网络代理,是 Kubernetes Service 资源的载体,负责维护网络规则和四层负载均衡工作。 负责写入规则至iptables、ipvs实现服务映射访问的

Kube-Proxy 本身不是直接给 Pod 提供网络,Pod 的网络是由 Kubelet 提供的,Kube-Proxy 实际上维护的是虚拟的 Pod 集群网络

Kube-apiserver 通过监控 Kube-Proxy 进行对 Kubernetes Service 的更新和端点的维护

在 K8S 集群中微服务的负载均衡是由 Kube-proxy 实现的。Kube-proxy 是 K8S 集群内部的负载均衡器。它是一个分布式代理服务器,在 K8S 的每个节点上都会运行一个 Kube-proxy 组件

容器引擎(docker 或 rocket)
容器引擎,运行容器,负责本机的容器创建和管理工作
当 kubernetes 把 pod 调度到节点上,节点上的 kubelet会指示 docker 启动特定的容器。接着,kubelet 会通过 docker 持续地收集容器的信息, 然后提交到主节点上。docker 会如往常一样拉取容器镜像、启动或停止容器。不同点仅仅在于这是由自动化系统控制而非管理员在每个节点上手动操作的

1.2 kubernetes工作流程

在这里插入图片描述
proxy:创建网络规则,制定转发规则,用户通过kubeproxy来访问pod。

用户:用户通过kubectl或其他方式与Kubernetes集群进行交互,创建、更新或删除资源对象。

防火墙:防火墙通常设置在网络边界,用于保护内部网络免受外部攻击。

K8S管理员:管理员使用kubectl命令行工具与Kubernetes API Server进行通信,对集群进行操作和管理。

API Server:这是Kubernetes的核心组件之一,用于接收并处理来自kubectl和其他组件的请求。它会将接收到的信息写入etcd存储中,并生成模板文件。

Auth身份验证:所有对API Server的请求都需要经过身份验证,只有通过验证后才能继续后续的操作。

scheduler调度器:负责计算后面node节点的资源,是否有足够的资源来存放容器(选择合适的节点进行调度),但不具备直接放容器的权限。

controller-manager控制器管理器:具有调动其他所有组件的权利,负责控制管理器中的各种控制器。当发生状态变化时,控制器会采取相应的措施(创建新的 pod、扩展副本数等),完成后将结果信息反馈给API Server。

kubelet:接收到API Server请求后,kublet调动docker创建pod,kublet不仅和容器引擎交互,实现容器的生命周期管理,还监控node节点上的资源信息,pod状态,将这些再汇报给API Server。

Docker:Docker引擎负责在Node节点上创建和管理容器。

在这个过程中,API Server会不断地将接收到的信息反馈给Scheduler和Controller Manager,以便它们可以根据最新的集群状态做出决策。同时,kubelet也会不断地将Node节点上的资源信息和Pod状态反馈给API Server,从而保证整个集群的正常运行。用户可以通过kubeproxy来访问pod,而proxy则会创建网络规则,制定转发规则

二、部署kubernetes集群

2.1 基础环境准备

节点规划

服务器IP规划 / 硬件配置
Master192.168.2.20 / 2CPU、3G
Node-1192.168.2.21 / 2CPU、2G
Node-2192.168.2.22 / 2CPU、2G

在这里插入图片描述修改主机名(所有节点均执行)
Master节点

[root@locallost ~]# hostnamectl  set-hostname  master
[root@locallost ~]# bash

Node1节点

[root@locallost ~]# hostnamectl  set-hostname  node1
[root@locallost ~]# bash

Node2节点

[root@locallost ~]# hostnamectl  set-hostname  node2
[root@locallost ~]# bash

设置hosts文件映射解析(所有节点均部署)

[root@master ~]# cat /etc/hosts
192.168.2.20	master
192.168.2.21	node1
192.168.2.22	node2

2.2 初始化系统

所有节点均部署

关闭交换分区
关闭系统中所有的交换分区,并注释交换分区相关条目

[root@master ~]# swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

禁用SElinux

[root@master~]# setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

关闭防火墙,并禁止自启动

[root@master ~]# systemctl stop firewalld && systemctl disable firewalld

关闭不需要的服务,并禁止自启动
postfix邮件服务可能会影响kubernetes的性能

[root@master ~]#  systemctl stop postfix && systemctl disable postfix

重置Iptables并设置空规则
先下载iptables服务

[root@master ~]# yum -y install iptables-services

启动iptables,清空规则并保存更改

[root@master ~]# systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

2.3 配置网络源

所有节点均部署
安装阿里云yum源

[root@master ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

安装epel源

[root@master~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

将repo文件中的地址修改为阿里云镜像地址

[root@master~]# sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@master~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

配置docker源

[root@master~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

配置kubernetes源

[root@master~]#  cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

**

2.4 系统环境优化

所有节点均部署
生成缓存,更新软件包

[root@master~]#  yum makecache && yum -y update

安装依赖包

[root@master~]# yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim-enhanced lrzsz  net-tools git net-tools psmisc bash-completion yum-utils.noarch nmap bind-utils

设置系统时区:中国上海

[root@master~]#  timedatectl set-timezone Asia/Shanghai

将当前的 UTC 时间写入硬件时钟

[root@master~]#  timedatectl set-local-rtc 0

重启依赖于系统时间的服务

[root@master~]# systemctl restart rsyslog
[root@master~]# systemctl restart crond

针对kubernetes调整内核参数

[root@master~]#  cat >kubernetes.conf.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
# 启用iptables对网桥流量的处理
net.bridge.bridge-nf-call-ip6tables=1
# 启用ip6tables对网桥流量的处理
net.ipv4.ip_forward=1  # 启用IPv4数据包转发
vm.swappiness=0 
# 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 			
# 不检查物理内存是否够用
vm.panic_on_oom=0 					
# 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

将 kubernetes.conf 文件复制到 /etc/sysctl.d/

[root@master~]# cp kubernetes.conf /etc/sysctl.d/kubernetes.conf

立即启用配置

[root@master~]# sysctl -p /etc/sysctl.d/kubernetes.conf

2.5 安装docker

所有节点均部署

[root@master~]# yum -y install docker-ce

配置镜像加速

[root@master~]# mkdir -p /etc/docker
 Cat /etc/docker/daemon.json <<EOF
{ 
"registry-mirrors":[
    "https://do.nark.eu.org", 
"https://dc.j8.work", 
"https://docker.m.daocloud.io", 
"https://dockerproxy.com", 
"https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn"
] 
} 
EOF

启用配置文件,并重启dockers设置开机自启

[root@master~]#  systemctl daemon-reload && systemctl restart docker && systemctl enable docker

2.6 安装kudeadm ,kubectl,kubelet

所有节点均部署

[root@master~]#yum -y install kubeadm-1.18.0 kubectl-1.18.0 kubelet-1.18.0

启动bubelet

[root@master~]# systemctl enable kubelet.service
[root@master ~]#  systemctl status kubelet 

2.7 初始化master节点

在master节点部署

[root@master~]# kubeadm init \
--apiserver-advertise-address=192.168.2.160 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

初始化成功后会出现上框出的命令
在master上运行第一个红框内的命令

[root@master~]# mkdir -p $HOME/.kube
[root@master~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master~]# chown $(id -u):$(id -g) $HOME/.kube/config

在这里插入图片描述

2.7 添加node节点到集群

在node节点上部署
在2个node节点上运行第二个红框内的命令
在这里插入图片描述
Node1节点

[root@node1~]# kubeadm join 192.168.2.20:6443 
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:424676564f3a33bc1d7d9451a322613188e39dcaa004386b453794d8135adaad

Node2节点

[root@node2~]# kubeadm join 192.168.2.20:6443 
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:424676564f3a33bc1d7d9451a322613188e39dcaa004386b453794d8135adaad

2.7 安装网络插件

在master节点部署

[root@node2~]#curl https://docs.projectcalico.org/archive/v3.18/manifests/calico.yaml -O

将网络插件部署到集群中

[root@node2~]# kubectl apply -f calico.yaml

拉取colico镜像
所有节点均部署,查看calico镜像

[root@master~]# grep image calico.yaml

在这里插入图片描述

依次拉取以上镜像至3台节点

[root@master~]# docker pull  docker.io/calico/cni:v3.18.6
[root@master~]# docker pull  docker pull  docker.io/calico/pod2daemon-flexvol:v3.18.6
[root@master~]# docker pull  docker.io/calico/node:v3.18.6
[root@master~]# docker pull docker.io/calico/kube-controllers:v3.18.6

查看节点状态
在master节点上查看

[root@master~]# kubectl get nodes

状态显示为 Ready 部署成功
在这里插入图片描述

2.8 测试kubernetes集群

在master节点部署
在Kubernetes集群中node中创建一个pod,验证是否正常运行

[root@master~]# kubectl create deployment nginx --image=nginx
[root@master~]# kubectl expose deployment nginx --port=80 --type=NodePort

在这里插入图片描述

[root@master~]# kubectl get pod,svc

在这里插入图片描述

在浏览器输入3节点ip地址

http:// 192.168.2.20

在这里插入图片描述

http:// 192.168.2.21

在这里插入图片描述

http:// 192.168.2.22

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值