系统学习K8s——简介与安装

艺帆风顺 发布于 2025-04-02 13 次阅读


1.部署模式的变迁

2.为什么用Kubernetes

3.Kubernetes安装

1.部署模式的变迁

作为应用的开发人员,我们不该只关心应用的开发,应用的部署也同样重要,(当我们有了三五年的开发经验后,会陷入一个难以提升的瓶颈,此时学习一些运维技能,可以拓宽我们的视野),帮助我们突破瓶颈。在部署应用的方式上,我们主要经历了三个时代:

传统部署时代:

  • 部署特点:

    • 直接在 物理机上部署 我们的应用程序。(打成jar包直接在物理机上java -jar运行)

  • 缺点:

    • 无法限制应用的资源边界,有资源分配等问题。

例如,我们在一台服务器上启动多个应用程序,可能会出现一个应用程序占大部分的资源,导致挤压到其它应用程序的资源,使其性能下降,但是如果一台机器只部署一个应用,就会导致资源利用率不足,扩展性差等缺点。为了解决上面这些问题,我们进入了虚拟化部署时代。

虚拟化部署时代:

  • 部署特点:

    • 虚拟化技术允许在单个服务器上运行多个虚拟机,隔离资源。

    • 一个应用的信息不能被另外一个应用访问到,提高了安全性。

    • 可以更轻松地添加或者更新应用程序,可以实现更好的伸缩性,降低硬件成本。

  • 缺点:

    • 虚拟层冗余导致重复安装操作系统,会有资源的浪费与性能下降。

容器化部署时代:

  • 部署特点:

    • 容器类似于VM,但是可以在应用程序之间共享操作系统。

    • 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。

  • 容器的优势:

    • 容器类似于VM,但是可以在应用程序之间共享操作系统。

    • 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。

    • 具体优势可以参照以前写的博客。系统学习Docker——Docker的简介与安装

当然容器化也带来了一系列的问题:

  • 容器一多带来的运维困难

  • 高性能的负载均衡访问机制

  • 便捷的自动扩缩容

  • 自动化的资源监测

  • ......

市面上有非常多的管理容器的工具,但是Kubernetes占比最高,所以我们来学习它。

2.为什么用Kubernetes

容器是打包和运行程序的高效的方式。但是在生产环境中,会有非常多的问题,比如如何确保容器不停机,如何确保容器出问题的时候自动重启,容器规模一大如何管理等,Kubernetes提供了非常多的方法来解决一系列容器管理问题,提供了一个可弹性运行分部署系统的框架。

Kubernetes会满足我们的扩缩容,部署模式,故障转移等等,为我们提供的主要功能如下:

  • 自动部署和回滚

    你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

  • 服务发现和负载均衡

    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排

    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

  • 自动完成装箱计算

    Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。

  • 自我修复

    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

  • 密钥与配置管理

    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥

3.Kubernetes安装

在安装之前,我们先了解一下Kubernetes的架构。

3.1 master-node 架构

Kubernetes的master-node架构并非主从复制架构,而是一种类似于地主+奴隶的组合。master: 主节点,主要分配任务的节点。

node: work节点(工作节点),具体部署服务(干活)的节点。

pod:是k8s运行容器的最小单元,k8s中的pod就如docker中的容器,区别是pod里可以由多个容器组成。

3.2 Kubernetes 工作原理

我们先介绍一下K8S个钟组件的名称以及作用:

  • kubectl: 程序员使用的命令工具,就和docker一样,docker的命令都是以docker开头,k8s的命令都是以kubectl开头。

  • api-server: 集群中所有操作的入口点,各个组件之间的交互都要通过api-server进行调度,犹如微服务的注册中心一般。

  • controller-manager: 负责运行集群的控制器,由它调度节点部署一些服务。

  • Scheduler: 负责决定pod应该运行在哪个k8s节点上。

  • etcd: 键值存储系统,用来存储部署信息等。

  • kubelet: 在每个 Node 上运行的代理,负责监控 Pod 的生命周期,确保 Pod 中的容器启动、运行并报告状态。

当k8s发布一次部署服务命令的时候,具体执行过程如下图所示:

假设让k8s部署一个tomcat服务:1.启动k8s集群,所有工作节点的kubelet,master节点的schedule,controller manager一直监听master的api-server发来的事件信息。2.程序员使用部署命令,kubectl create deploy tomcat --image=tomcat8 告诉master让集群使用tomcat8镜像,部署一个tomncat8服务。3.kubectl将命令发送给api-server,api-server保存此次创建信息到etcd。4.etcd给api-server上报事件,说刚才有人给我保存了一个信息。(部署tomcat)5.controller-manager监听到api-server的事件,是部署toncat,并生成pod信息。6.controller-manager把pod信息交给api-server,再保存到etcd。7.etcd再次上报pod信息给api-server.8.schedule专门监听pod信息,拿到pod信息的内容,看哪个节点适合部署这个pod,生成pod调度过后的信息。9.scheduler把pod调度过的信息交给api-server,保存到etcd。10.etcd上报pod调度过后的信息,交给api-server。11.其他节点的kubelet专门监听pod调度过后的信息,集群所有kubelet从api-server拿到了调度过后的pod信息。12.每个节点判断部署这个tomcat服务,是否属于自己的事情,其中一个工作节点判断这个部署信息属于它的工作。13.工作节点启动这个pod,汇报给master节点当前启动好的所有信息。

安装过程:

我们先准备3台centos,内网互通,且能上网。

1.基础环境先将装好的虚拟机能联网:

先让centos能上网,修改网关配置:vi /etc/sysconfig/network-scripts/ifcfg-ens33 #把onboot修改为:onboot = yes#重启nmcli c reload#关闭防火墙:如果是云服务器,需要设置安全组策略放行端口systemctl stop firewalldsystemctl disable firewalld# 修改 hostnamehostnamectl set-hostname k8s-01# 查看修改结果hostnamectl status# 设置 hostname 解析echo "127.0.0.1   $(hostname)" >> /etc/hosts#关闭 selinux:sed -i 's/enforcing/disabled/'/etc/selinux/configsetenforce 0#关闭 swap:swapoff -a  sed -ri 's/.*swap.*/#&/'/etc/fstab

2.docker环境

sudo yum remove docker*sudo yum install -y yum-utils#配置docker yum 源sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装docker 19.03.9yum install -y docker-ce-3:19.03.9-3.el7.x86_64  docker-ce-cli-3:19.03.9-3.el7.x86_64 containerd.io#安装docker 19.03.9   docker-ce  19.03.9yum install -y docker-ce-19.03.9-3  docker-ce-cli-19.03.9 containerd.io#启动服务systemctl start dockersystemctl enable docker#配置加速sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json 'EOF'{"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker

3.安装k8s核心

# 配置K8S的yum源cat EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF# 卸载旧版本yum remove -y kubelet kubeadm kubectl# 查看可以安装的版本yum list kubelet --showduplicates | sort -r# 安装kubelet、kubeadm、kubectl 指定版本yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0# 开机启动kubeletsystemctl enable kubelet && systemctl start kubelet

4.初始化master节点

############下载核心镜像 kubeadm config images list:查看需要哪些镜像###############封装成images.sh文件#!/bin/bashimages=(  kube-apiserver:v1.21.0  kube-proxy:v1.21.0  kube-controller-manager:v1.21.0  kube-scheduler:v1.21.0  coredns:v1.8.0  etcd:3.4.13-0  pause:3.4.1)for imageName in${images[@]} ; do    docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageNamedone#####封装结束chmod +x images.sh && ./images.shdocker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/pause:3.4.1# registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/coredns:v1.8.0##注意1.21.0版本的k8s coredns镜像比较特殊,结合阿里云需要特殊处理,重新打标签docker tag registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/coredns:v1.8.0 registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/coredns/coredns:v1.8.0# 这里的advertise-address 是虚拟机ip地址########kubeadm init 一个master################################kubeadm join 其他worker########################kubeadm init --apiserver-advertise-address=192.168.91.152 --image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images --kubernetes-version v1.21.0 --service-cidr=10.96.0.0/16 --pod-network-cidr=192.168.0.0/16## 注意:pod-cidr与service-cidr# cidr 无类别域间路由(Classless Inter-Domain Routing、CIDR)# 指定一个网络可达范围  pod的子网范围+service负载均衡网络的子网范围+本机ip的子网范围不能有重复域kubeadm join 192.168.91.148:6443 --token 5qgew7.xotpict8okggqpgh    --discovery-token-ca-cert-hash sha256:02458de1c9f2aa40ffce7453a1a38c688ef78990894fb52d55b9d9408fbcc8af ######按照提示继续######## init完成后第一步:复制相关文件夹To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kube  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  sudo chown $(id -u):$(id -g) $HOME/.kube/config## 导出环境变量Alternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.conf### 部署一个pod网络You should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:  https://kubernetes.io/docs/concepts/cluster-administration/addons/##############如下:安装calico######################kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml#第一条命令不能用,用下面这条,目的是为了安装一个网络通信组件kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml### 命令检查kubectl get pod -A  ##获取集群中所有部署好的应用Podkubectl get nodes  ##查看集群所有机器的状态Then you can join any number of worker nodes by running the following on each as root:kubeadm join 172.24.80.222:6443 --token nz9azl.9bl27pyr4exy2wz4    --discovery-token-ca-cert-hash sha256:4bdc81a83b80f6bdd30bb56225f9013006a45ed423f131ac256ffe16bae73a20

5.初始化worker节点

## 用master生成的命令即可kubeadm join 172.24.80.222:6443 --token nz9azl.9bl27pyr4exy2wz4    --discovery-token-ca-cert-hash sha256:4bdc81a83b80f6bdd30bb56225f9013006a45ed423f131ac256ffe16bae73a20 ##过期怎么办kubeadm token create --print-join-commandkubeadm token create --ttl 0 --print-join-commandkubeadm join --token y1eyw5.ylg568kvohfdsfco --discovery-token-ca-cert-hash sha256: 6c35e4f73f72afd89bf1c8c303ee55677d2cdb1342d67bb23c852aba2efc7c73

6、验证集群

#获取所有节点kubectl get nodes#给节点打标签## k8s中万物皆对象。node:机器  Pod:应用容器###加标签  《h1》kubectl label node k8s-02 node-role.kubernetes.io/worker=''###去标签kubectl label node k8s-02 node-role.kubernetes.io/worker-## k8s集群,机器重启了会自动再加入集群,master重启了会自动再加入集群控制中心

从此k8s就安装完毕了!

    版权声明:本文内容来自个人博客segmentfault:苏凌峰,遵循CC 4.0 BY-SA版权协议上原文接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行可。原文链接:https://segmentfault.com/a/1190000044965691如有涉及到侵权,请联系,将立即予以删除处理。在此特别鸣谢原作者的创作。此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。