一、kubernetes
1、简介
kubernetes,简称K8s(库伯内特),是用8代替名字中间的8个字符“ubernete”而成的缩写
云计算的三种主要服务模式——基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)
Kubernetes是一个应用于大规模部署你分布式应用的平台,它管理着一系列的主机或服务器(Node节点),节点中最小单元Pod
- Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。
- Kubernetes 这个名字源于希腊语,意为
“舵手”
或“飞行员”
。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在Google 在大规模运行生产工作负载方面拥有十几年的经验的基础上,结合了社区中最好的想法和实践
官网地址:https://kubernetes.io/
为什么使用K8s
-
容器是打包和运行应用程序的最佳方式,在生产环境中,我们需要管理运行应用程序的容器,并且确保这些容器不会停机。如果一个容器发生了故障,则需要手动启动另一个容器,太麻烦了;如果有一个系统能够帮助我们处理这些行为,是不是会很方便?
-
Kubernetes 就能解决上面提出的一系列的问题。Kubernetes 为我们提供了一个可弹性运行的分布式系统的框架,Kubernetes 可以满足我们的扩展要求、故障转移、部署模式等,如:Kubernetes 可以轻松管理系统的 Canary(金丝雀) 部署。
-
Kubernetes 为我们提供下面的功能:
-
①
服务发现和负载均衡
:Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使得部署稳定。 -
②
存储编排
:Kubernetes 允许我们自动挂载自己选择的存储系统,如:本地存储、公有云提供商等。 -
③
自动部署和回滚
:我们可以使用 Kubernetes 描述已部署容器的所需状态,Kubernetes 可以以受控的速率将实际状态更改为期望状态,如:我们可以自动化 Kubernetes 来为我们的部署创建新的容器,删除现有容器并将它们的所有资源用于新的容器。 -
④
自动完成装箱计算
:Kubernetes 允许我们指定每个容器所需要的 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。 -
⑤
自我修复
:Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。 -
⑥
密钥和配置管理
:Kubernetes 允许我们存储和管理敏感信息,如:密码、OAuth2 令牌和 SSH 密钥。我们可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需再堆栈配置中暴露密钥。
2、Kubernetes的特点:
1、自我修复在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端的请求,确保线上服务不中断。2、弹性收缩使用命令、UI 或者基于 CPU 使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。3、自动部署和回滚采用滚动更新策略更新应用,一次更新一个 Pod,而不是同时删除所有 Pod,如果更新过程中出现问题,将回滚更改,确保升级升级过程中不影响业务运行4、服务发现和负载均衡能够为多个容器提供统一访问入库(内部 IP 地址和一个 DNS 名称),并且负载均衡关联所有容器,使用户无需考虑容器 IP 的问题5、存储编排能够挂载外部存储系统,无论是来自本地存储,公有云(如:AWS),还是网络存储(如:NFS、ClusterFS、Ceph)都可以作为集群资源的一部分使用,极大提供存储使用的灵活
3、K8S集群原理
- Master 节点(Control Plane【控制面板】):Master 节点控制整个集群。
- Controller Manager:控制管理器。
- etcd:键值数据库,类似于 Redis。
- scheduler:调度器。
- api-server:api网关(所有的控制都需要通过api-server)。
- Node 节点(worker工作节点):
- kubelet(监工):每一个 Node 节点上必须安装的组件,负责交互 master 的 api-server 以及当前机器的应用启停等,在 master 机器就是 master 的小助手。每一台机器真正干活的都是这个 Kubelet 。
- kube-proxy:代理网络。
- Pod:
- docker run 启动的是一个 container(容器),容器是 Docker 的基本单位,一个应用就是一个容器。
- kubectl run 启动的是一个应用称为一个 Pod ,Pod 是 Kubernetes 的基本单位。
- Pod 是对容器的再一次封装。
- Pod 类似于 Java 日志体系中的 Slf4j ,而 Docker 中的容器类似于 Java 日志体系中的 Logback 等日志实现。
- 一个容器往往代表不了一个基本应用,如:博客系统(WordPress,PHP + MySQL);但是一个 Pod 可以包含多个 Container,一个 Pod 可以代表一个基本的应用。
4、主控节点 / Master 组件
kubectl: 命令行工具
Dashboard: 可视化界面
api-server: 接口服务,给予REST风格开放,K8S接口的服务,集群统一入口,各组件的协调者,提供认证、授权、访问控制、API注册和发现等机制,以 RESTful API 的方式提供接口服务,所有对象资源的增删改查和监听都由 API Server 处理后提交给 Etcd 存储。
controller-manager:控制器管理器,负责各个类型的控制器针对k8S 中的各种资源进行管理,控制器管理程序,负责控制器的管理,控制器和资源一一对应,控制器用于维护集群的状态,如:故障检测、自动扩展、滚动更新等常规后台任务。
cloud-controller-manager: 云控制器管理器,第三方云平台提供控制API对接管理功能
kube-scheduler: 调度程序,负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上,调度程序根据调度算法为新创建的 Pod 选择一个 Node 节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上Etcd Cluster:分布式键值存储系统集群,用于保存集群状态数据,如:Pod、Service 等资源对象信息。
5、工作节点 / Node 组件
1)Kubelet:主控节点代理程序,在 Node 节点上执行 Master 节点安排的任务,它将每个 Pod 转换成一组容器,用于管理本节点运行容器的生命周期,如:创建容器、Pod 挂载数据卷、下载 Secret 、获取容器和节点状态等工作。2)Kube-Proxy:网络代理程序,在 Node 节点上实现 Pod 网络代理,负责为 Service 提供 Cluster 内部的服务发现、网络规划和负载均衡。3)container-runtime: Docker容器引擎,负责所有具体的映像下载和容器运行、containerd、CRI-O4)Pod: 容器1 容器2
7、第三方插件
1)Flannel Finnal 是一个为 K8s 原生集成的三层网络解决方案,主要用于解决容器之间的网络(CNI 网络)通信问题,Flannel 为每个 Node 工作节点分配独立的子网网段,并将所有的网络信息存储在 Etcd 数据库中。脱离 CNI 网络的 K8s 集群是无法工作的,因此在部署 K8s 集群时必须部署 Flannel 插件。2)CoreDN SCoreDNS 是一个为 K8s 原生集成的域名发现解决方案,主要用于将 K8s 服务的动态 IP 地址自动映射成为 "<service-name>:<service-namespace>" 规则的 DNS 域名。因 K8s 在创建服务时会分配动态的 IP 地址,因此当在【B 容器 】中使用【A 容器】发布的服务,因为【A 容器】的服务对应的 IP 是动态可变的,所以应当通过该服务对应的 DNS 获取,例如:"htp(s)://:"。3)Dashboard Dashboard 是一个为 K8s 原生集成的用户界面,主要用于 K8s 的可视化管理。使用 Dashboard 可以监控、管理 K8s 集群和集群中的各类资源(如 Deployment,Job,DaemonSet 等等),还可以完成对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新应用等管理行为。4)Ingress-Nginx Ingress-Nginx 是一个为 K8s 原生集成的服务网关,主要用于对集群中的服务(通常是 Http 或 Https 服务)的外部访问的 API 对象,以及提供负载平衡、SSL 终端和基于名称的虚拟主机
8、应用场景
K8s 主要应用于云架构和云原生的部署场景。
“云” 是使用容器构建的一套服务集群网络,它由很多的容器构成;
“K8s” 则是用来管理云中的容器平台工具
1、云架构
PaaS(平台即服务): 运营商提供 MySQL 、Redis、MQ、Elasticsearch 等数据库或中间件等服务;用户租用(购买或分配权限)后直接使用。
SaaS(软件即服务):运营商提供应用系统的部署和发布等服务;用户租用(购买或分配权限)后直接使用
2、云原生
为了让应用程序(项目,服务软件)都运行在云上的解决方案,这样方案叫做云原生,有以下特点:容器化:所有的服务都必须部署在容器中;微服务:Web 服务架构是微服务架构;CI/CD:可持续交互和可持续部署;DevOps:开发和运维密不可分
二、K8s环境安装
一、前期准备
K8s-master01 k8s-node1 k8s-node02
kubernetes 版本: 1.23.6
Docker版本:20+
k8s: 1.23.6
docker官网版本:20.10.0 https://docs.docker.com/engine/release-notes/20.10/
清华云:docker下载离线版本https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/static/stable/x86_64/
-
根据Kubernetes官方文档和相关可靠资源,以下是一些常见Kubernetes版本推荐的Docker版本:
- Kubernetes 1.13 到 1.19:推荐使用Docker 1.13.1 到 19.03.x版本。
- Kubernetes 1.20:推荐使用Docker 1.13.1 到 19.03.x版本,但Kubernetes官方开始逐步废弃对Docker作为容器运行时的直接支持。
- Kubernetes 1.21 到 1.22:推荐使用Docker 1.19.3 到 20.10.x版本。
- Kubernetes 1.23及以上版本:建议使用符合容器运行时接口(CRI)的运行时,如containerd或CRI-O,不再支持Docker作为容器运行时。
2.注意事项:
-
从Kubernetes 1.20开始,Kubernetes官方逐步废弃了对Docker作为容器运行时的直接支持。对于Kubernetes 1.23及更高版本,kubeadm默认使用containerd作为容器运行时,不再支持Docker。
-
如果你的集群仍在使用Docker作为容器运行时,建议尽快迁移到CRI兼容的运行时,以确保与Kubernetes的兼容性。
K8S-master01:
centos7、2CPU、4G 内存、40G存储空间(将虚拟机磁盘存储为单个文件)、NAT模式、带GUI服务器安装、打开网卡
K8S-node01:
centos7、2G 内存、40G存储空间(将虚拟机磁盘存储为单个文件)、NAT模式、带GUI服务器安装、打开网卡
K8S-node02:
centos7、2G 内存、40G存储空间(将虚拟机磁盘存储为单个文件)、NAT模式、带GUI服务器安装、打开网卡
最终目标
在所有节点上安装Docker 和kubeadm
部署Kubernetes Master
部署容器网络插件
部署Kubernetes Node,将节点加入Kubernetes 集群中
部署Dashboard Web 页面,可视化查看Kubernetes 资源
二、虚拟机安装完毕进入linux操作系统-所有的节点及master配置
现在centos7不支持更新了换yum源,更新阿里云yum源
[root@localhost ~]# rm -rf /etc/yum.repos.d/*
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@localhost ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# yum repolist -v
1、最小安装没有ifconfig命令: yum search ifconfig提示包名为: net-tools.x86_64使用yum安装: yum -y install net-tools.x86_64没有vim命令: yum -y install vim*
2、关闭防火墙[root@localhost ~]# systemctl stop firewalld[root@localhost ~]# systemctl disable firewalld3、关闭SELINUX:[root@k8smaster ~]# vi /etc/selinux/configSELINUX=disabled4、关闭swap:
[root@k8smaster ~]# swapoff -a
[root@k8smaster ~]# vim /etc/fstab 关闭swap那行 ##/dev/mapper/centos-swap swap swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明 5、设置主机名
[root@k8s-master ~]# hostnamectl set-hostname k8s-master
[root@k8s-node01 ~]# hostnamectl set-hostname k8s-node01[root@k8smaster ~]# vim /etc/hosts192.168.110.140 k8s-master192.168.110.141 k8s-node016、将桥接的IPv4流量传递到iptables的链
[root@k8smaster ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@k8smaster ~]# sysctl --system #生效7、设置时间同步
[root@k8smaster ~]# yum -y install ntpdate
[root@k8smaster ~]# ntpdate time.windows.com #测试命令
22 Jun 18:56:53 ntpdate[8157]: adjust time server 20.189.79.72 offset -0.006902 sec
2、安装Docker
[root@k8s-master ~]#yum -y install docker-ce-20.10.16 docker-ce-cli-20.10.16 containerd.io
[root@k8s-node01 ~]#yum -y install docker-ce-20.10.16 docker-ce-cli-20.10.16 containerd.io
#启动服务及设置开机自启
[root@k8s-master ~]# systemctl start docker containerd
[root@k8s-master ~]# systemctl enable docker containerd
添加镜像加速器
cat > /etc/docker/daemon.json << EOF
{"dns": ["8.8.8.8", "8.8.4.4"],"insecure-registries":["192.168.200.15"],"registry-mirrors": ["https://docker.1ms.run","https://hub.mirrorify.net","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://mirror.baidubce.com"]
}
EOF
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker containerd
3、安装k8s-配置repo文件
[root@k8s-master ~]# vim /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/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
4、安装kubeadm kubele 和 kubectl
注意: master 和node节点都装
[root@k8s-master ~]#yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
[root@k8s-node01 ~]#yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
#启动服务
[root@k8s-master ~]# systemctl start kubelet
[root@k8s-master ~]# systemctl enable kubelet
5、修改containerd源
# 生成 containerd 的默认配置文件
[root@k8s-master ~]# containerd config default > /etc/containerd/config.toml
[root@k8s-master ~]# vim /etc/containerd/config.tomlsandbox_image = "registry.k8s.io/pause:3.6"#修改为:sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker containerd
6、master配置初始化
kubeadm init --apiserver-advertise-address=192.168.110.140 --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.23.6 --service-cidr=10.96.0.0/16 --pod-network-cidr=10.244.0.0/16#参数说明
-–apiserver-advertise-address:通告侦听地址
–-image-repository:指定镜像地址使用阿里云的,默认会使用谷歌镜像
–-kubernetes-version:指定当前的kubernetes的版本
–-pod-network-cidr=10.244.0.0/16:flannel网络的固定地址范围
[root@k8s-master ~]# kubeadm reset 重置
常见的错误1
解决办法:加速器配置文件
[root@k8s-master ~]# vim /etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"]
[root@k8s-node01 ~]# systemctl daemon-reload
[root@k8s-node01 ~]# systemctl restart docker
解决错误之后,重置了初始化命令
[root@k8s-master ~]# kubeadm reset 重置
继续执行如下命令
kubeadm init --apiserver-advertise-address=192.168.110.140 --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.23.6 --service-cidr=10.96.0.0/16 --pod-network-cidr=10.244.0.0/16
如何执行正常的界面如下
pod节点需要加入时,执行提示命令:
kubeadm join 192.168.110.140:6443 --token 1hft5e.vb1xncstdogsk4ay \--discovery-token-ca-cert-hash sha256:a5d9376d48397caf6ed1f9daf59d51a41cfe012d0e85b15e5eb158c312cba49a
7、使用kubectl工具
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 31m v1.23.6
8、node节点加入kubernetes
[root@k8s-node01 ~]# kubeadm join 192.168.110.140:6443 --token 1hft5e.vb1xncstdogsk4ay \--discovery-token-ca-cert-hash sha256:a5d9376d48397caf6ed1f9daf59d51a41cfe012d0e85b15e5eb158c312cba49a
常见错误2:端口被占用了
[root@k8s-node01 ~]# kubeadm reset #重置,根据提示输入y
9、网络插件的安装
CNI(Container Network Interface)是 Kubernetes 集群的网络模型,用于定义容器与容器之间的通信方式。在部署 CNI 网络组件之前,需要选择合适的 CNI 插件,例如 Calico、Flannel 等。 在部署 CNI 插件之前,需要安装相应的依赖软件,例如 Docker、etcd 等。然后,根据所选的 CNI 插件的文档,进行相应的配置和安装。一旦 CNI 插件安装完成,Kubernetes 集群中的节点将自动加入到网络中,并能够与其他节点进行通信
9.1部署Calico插件
[root@k8s-master ~]# mkdir /opt/k8s
[root@k8s-master ~]# cd /opt/k8s
[root@k8s-master k8s]# wget https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml
#如果是下载到Windows下,上传到系统的/root/再执行如下命令
[root@k8s-master k8s]# cp /root/calico.yaml /opt/k8s/[root@k8s-master k8s]# grep image calico.yamlimage: docker.io/calico/cni:v3.25.0imagePullPolicy: IfNotPresentimage: docker.io/calico/cni:v3.25.0imagePullPolicy: IfNotPresentimage: docker.io/calico/node:v3.25.0imagePullPolicy: IfNotPresentimage: docker.io/calico/node:v3.25.0imagePullPolicy: IfNotPresentimage: docker.io/calico/kube-controllers:v3.25.0imagePullPolicy: IfNotPresent#修改配置文件,不适用默认的dokcer.io网站下载
[root@k8s-master k8s]# sed -i 's#docker.io/##g' calico.yaml
# 执行calico.yml
[root@k8s-master k8s]# kubectl apply -f calico.yaml
#查看节点的状态
[root@k8s-master k8s]# kubectl get pod -n kube-system
[root@k8s-master k8s]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-cd8566cf-rcqpf 1/1 Running 0 6m39s
calico-node-d2hvm 1/1 Running 0 6m39s
calico-node-mfdqw 1/1 Running 0 6m39s
coredns-6d8c4cb4d-js7jd 1/1 Running 0 4h14m
coredns-6d8c4cb4d-n9m22 1/1 Running 0 4h14m
etcd-k8s-master 1/1 Running 0 4h14m
kube-apiserver-k8s-master 1/1 Running 0 4h14m
kube-controller-manager-k8s-master 1/1 Running 0 4h14m
kube-proxy-fm5gr 1/1 Running 0 3h39m
kube-proxy-grw5b 1/1 Running 0 4h14m
kube-scheduler-k8s-master 1/1 Running 0 4h14m
[root@k8s-master k8s]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 4h16m v1.23.6
k8s-node01 Ready <none> 3h41m v1.23.6
[root@k8s-master k8s]#
总结整体的部署思路/过程
1、根据要求安装虚拟机 k8s-master (2个CPU 4G内存) k8s-node
2、对系统初始化设置:Yum源配置 防火墙配置 SELINUX 主机名配置 虚拟内存 hosts文件设置
3、安装docker kubelet kubeadm kubectl
4、在k8s-master上配置 初始化 kubeadm init
5、在k8s-node 上 kubeadm join
6、互通:网络管理插件