k8s部署安装

知识点

一、Kubernetes 简介及部署方法

1、应用部署方式演变

在部署应用程序的方式上,主要经历了三个阶段:
传统部署 :互联网早期,会直接将应用程序部署在物理机上
  • 优点:简单,不需要其它技术的参与
  • 缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响
虚拟化部署 :可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境
  • 优点:程序环境不会相互产生影响,提供了一定程度的安全性
  • 缺点:增加了操作系统,浪费了部分资源
容器化部署 :与虚拟化类似,但是共享了操作系统
Note
容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:
  • 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
  • 当并发访问量变大的时候,怎么样做到横向扩展容器数量

2、容器编排应用

为了解决这些容器编排问题,就产生了一些容器编排的软件:
  • SwarmDocker自己的容器编排工具
  • MesosApache的一个资源统一管控的工具,需要和Marathon结合使用
  • KubernetesGoogle开源的的容器编排工具

3、kubernetes 简介

  • Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年
  • Borg系统运行管理着成千上万的容器应用。
  • Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。
  • Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。
kubernetes 的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷

4、K8S的设计架构

4.1 K8S各个组件用途

一个 kubernetes 集群主要是由 控制节点 (master) 工作节点 (node) 构成,每个节点上都会安装不同
的组件
1、master :集群的控制平面,负责集群的决策
  • ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
  • Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
  • ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新
  • Etcd :负责存储集群中各种资源对象的信息
2、node :集群的数据平面,负责为容器提供运行环境
  • kubelet:负责维护容器的生命周期,同时也负责VolumeCVI)和网络(CNI)的管理
  • Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI
  • kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡

4.2 K8S 各组件之间的调用关系

当我们要运行一个 web 服务时
1. kubernetes 环境启动之后, master node 都会将自身的信息存储到 etcd 数据库中
2. web 服务的安装请求会首先被发送到 master 节点的 apiServer 组件
3. apiServer 组件会调用 scheduler 组件来决定到底应该把这个服务安装到哪个 node 节点上
在此时,它会从 etcd 中读取各个 node 节点的信息,然后按照一定的算法进行选择,并将结果告知
apiServer
4. apiServer 调用 controller-manager 去调度 Node 节点安装 web 服务 5. kubelet 接收到指令后,会通知 docker ,然后由 docker 来启动一个 web 服务的 pod
6. 如果需要访问 web 服务,就需要通过 kube-proxy 来对 pod 产生访问的代理

4.3 K8S 的 常用名词感念

  • Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
  • Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的
  • Podkubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
  • Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
  • Servicepod对外服务的统一入口,下面可以维护者同一类的多个pod
  • Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
  • NameSpace:命名空间,用来隔离pod的运行环境

4.4 k8S的分层架构

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS析等)
  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBACQuotaPSPNetworkPolicy等)
  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦
  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
  • Kubernetes外部:日志、监控、配置管理、CICDWorkflowFaaSOTS应用、ChatOps
  • Kubernetes内部:CRICNICVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

二、K8S集群环境搭建

1、k8s中容器的管理方式

K8S 集群创建方式有 3 种:
centainerd
默认情况下, K8S 在创建集群时使用的方式
docker
Docker 使用的普记录最高,虽然 K8S 1.24 版本后已经费力了 kubelet docker 的支持,但时可以
借助cri-docker方式来实现集群创建
cri-o
CRI-O 的方式是 Kubernetes 创建容器最直接的一种方式,在创建集群的时候,需要借助于 cri-o 插件
的方式来实现Kubernetes 集群的创建。
Note
docker cri-o 这两种方式要对 kubelet 程序的启动参数进行设置

实验部分

一、实验环境准备

1、搭建hub

[root@docker-hub yum.repos.d]# ls
redhat.repo  rhel9.repo
[root@docker-hub yum.repos.d]# vim docker.repo
[root@docker-hub yum.repos.d]# yum install docker-ce -y
[root@docker-hub yum.repos.d]# cd
[root@docker-hub ~]# vim /usr/lib/systemd/system/docker.service


[root@docker-hub ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@docker-hub ~]# docker info

[root@docker-node1 ~]# mkdir certs

[root@docker-node1 ~]# vim /etc/hosts

[root@docker-node1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/timinglee.org.key -addext "subjectAltName = DNS:reg.timinglee.org" -x509 -days 365 -out certs/timinglee.org.crt

[root@docker-hub harbor]# mkdir /data/
[root@docker-hub harbor]# ll /data/
总用量 0
[root@docker-hub harbor]# cp /root/certs/ /data/ -r
[root@docker-hub harbor]# ls /data/
certs
[root@docker-hub harbor]# ls /data/certs/
timinglee.org.crt  timinglee.org.key

本地解析

C:\Windows\System32\drivers\etc\hosts

[root@docker-hub harbor]#  mkdir -p /etc/docker/certs.d/reg.timinglee.org -p
[root@docker-hub harbor]# cd /root/certs/
[root@docker-hub certs]# ls
timinglee.org.crt  timinglee.org.key
[root@docker-hub certs]# cp /root/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@docker-hub certs]# ls /etc/docker/certs.d/reg.timinglee.org/ca.crt
/etc/docker/certs.d/reg.timinglee.org/ca.crt

上传镜像

[root@reg harbor]# docker tag  nginx:latest  reg.timinglee.org/timinglee/nginx:latest
[root@reg harbor]# docker push  reg.timinglee.org/timinglee/nginx:latest

The push refers to repository [reg.timinglee.org/timinglee/nginx]
5f0272c6e96d: Pushed
f4f00eaedec7: Pushed
55e54df86207: Pushed
ec1a2ca4ac87: Pushed
8b87c0c66524: Pushed
72db5db515fd: Pushed
9853575bc4f9: Pushed
latest: digest: sha256:127262f8c4c716652d0e7863bba3b8c45bc9214a57d13786c854272102f7c945 size: 1778

2、实验环境

  • 所有节点禁用selinux和防火墙
  • 所有节点同步时间和解析
  • 所有节点安装docker-ce
  • 所有节点禁用swap,注意注释掉/etc/fstab文件中的定义

[root@k8s-master ~]# vmset.sh eth0 172.25.254.100 k8s-master.timinglee.org
[root@k8s-node1 ~]# vmset.sh eth0 172.25.254.10 k8s-node1.timinglee.org
[root@k8s-node2~]# vmset.sh eth0 172.25.254.20 k8s-node2.timinglee.org
[root@docker-hub ~]# vmset.sh eth0 172.25.254.250 docker-hub.timinglee.org

本地解析

[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.20:/etc/hosts
[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.100:/etc/hosts
[root@k8s-node1 ~]# scp /etc/hosts root@172.25.254.250:/etc/hosts

检测软件仓库

安装docker

[root@k8s-master ~]# mkdir /etc/docker/certs.d/reg.timinglee.org/ -p

[root@reg ~]# scp /data/certs/timinglee.org.crt root@172.25.254.100:/etc/docker/certs.d/reg.timinglee.org/ca.crt
[root@k8s-master ~]# vim /etc/docker/daemon.json

[root@k8s-master ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@k8s-master ~]# docker info

检测

[root@k8s-master ~]# docker pull timinglee/nginx:latest

k8s-node1、k8s-node2配置

[root@k8s-master ~]# scp *.rpm root@172.25.254.10:/mnt
[root@k8s-master ~]# scp *.rpm root@172.25.254.20:/mnt

[root@k8s-node1 ~]# cd /mnt/
[root@k8s-node1 mnt]# ls
containerd.io-1.7.20-3.1.el9.x86_64.rpm
docker-buildx-plugin-0.16.2-1.el9.x86_64.rpm
docker-ce-27.1.2-1.el9.x86_64.rpm
docker-ce-cli-27.1.2-1.el9.x86_64.rpm
docker-ce-rootless-extras-27.1.2-1.el9.x86_64.rpm
docker-compose-plugin-2.29.1-1.el9.x86_64.rpm
hgfs
[root@k8s-node1 mnt]# dnf install *.rpm -y
[root@k8s-node2 mnt]# dnf install *.rpm -y
[root@k8s-master ~]# scp -r /etc/docker/ root@172.25.254.10:/etc/
root@172.25.254.10's password:
ca.crt                                                                      100% 2187     2.0MB/s   00:00
daemon.json                                                                 100%   55     5.1KB/s   00:00
[root@k8s-master ~]# scp -r /etc/docker/ root@172.25.254.20:/etc/
root@172.25.254.20's password:
ca.crt                                                                      100% 2187     2.0MB/s   00:00
daemon.json                                                                 100%   55     5.1KB/s   00:00
[root@k8s-node2 mnt]# cd /etc/docker/
[root@k8s-node2 docker]# ls
certs.d  daemon.json
[root@k8s-node2 docker]# cd certs.d/
[root@k8s-node2 certs.d]# ls
reg.timinglee.org
[root@k8s-node2 certs.d]# cd ..
[root@k8s-node2 docker]# cat daemon.json
{
  "registry-mirrors":["https://reg.timinglee.org"]
}
[root@k8s-node1 mnt]# systemctl enable --now docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@k8s-node2 mnt]# systemctl enable --now docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@k8s-node1 mnt]# docker info

[root@k8s-node2 docker]# docker pull nginx:latest
 

二、k8s安装

 所有禁用swap

[root@k8s-master ~]# swapon -s
Filename                                Type            Size            Used            Priority
/dev/dm-1                               partition       4108284         0               -2

[root@k8s-node1 ~]# systemctl  mask dev-nvme0n1p3.device
Created symlink /etc/systemd/system/dev-nvme0n1p3.device → /dev/null.
[root@k8s-node2 ~]# systemctl  mask dev-nvme0n1p3.device
Created symlink /etc/systemd/system/dev-nvme0n1p3.device → /dev/null.

[root@k8s-node2 ~]# vim /etc/fstab

[root@k8s-node2 ~]# swapoff /dev/dm-1
[root@k8s-node2 ~]# swapon -s
[root@k8s-node1 dev]# systemctl status dev-dm\\x2d1.swap
● dev-dm\x2d1.swap - /dev/dm-1
    Follows: unit currently follows state of dev-mapper-rhel\x2dswap.swap
     Loaded: loaded
     Active: active since Thu 2024-09-26 17:59:08 CST; 2 days ago
      Until: Thu 2024-09-26 17:59:08 CST; 2 days ago
       What: /dev/dm-1
[root@k8s-node1 dev]# systemctl mask dev-dm\\x2d1.swap
Created symlink /etc/systemd/system/dev-dm\x2d1.swap → /dev/null.
[root@k8s-node1 dev]# vim /etc/fstab
[root@k8s-node1 dev]# swapoff /dev/dm-1
[root@k8s-node1 dev]# swapon -s
 

安装k8s 

安装依赖

[root@k8s-master ~]# cd /mnt/
[root@k8s-master mnt]# ls
cri-dockerd-0.3.14-3.el8.x86_64.rpm  hgfs  libcgroup-0.41-19.el8.x86_64.rpm

[root@k8s-master mnt]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm  root@172.25.254.10:/opt/
[root@k8s-master mnt]# scp cri-dockerd-0.3.14-3.el8.x86_64.rpm libcgroup-0.41-19.el8.x86_64.rpm  root@172.25.254.20:/opt/                                      
[root@k8s-node1 ~]# dnf install /opt/*.rpm -y
[root@k8s-node2 ~]# dnf install /opt/*.rpm -y
[root@k8s-node1 ~]# systemctl enable --now cri-docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service → /usr/lib/systemd/system/cri-d

[root@k8s-node2 ~]# systemctl enable --now cri-docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/cri-docker.service → /usr/lib/systemd/system/cri-d

[root@k8s-master ~]# cd /etc/yum.repos.d/
[root@k8s-master yum.repos.d]# ls
redhat.repo  rhel9.repo
[root@k8s-master yum.repos.d]# vim k8s.repo

[root@k8s-master yum.repos.d]# dnf install kubelet-1.30.0 kubeadm-1.30.0 --downloadonly --downloaddir=/mnt

[root@k8s-node2 mnt]#  dnf install kubectl-1.30.0 --downloadonly --downloaddir=/mnt
[root@k8s-master yum.repos.d]# scp /etc/yum.repos.d/k8s.repo  root@172.25.254.20:/etc/yum.repos.d/
[root@k8s-master yum.repos.d]# scp /etc/yum.repos.d/k8s.repo  root@172.25.254.10:/etc/yum.repos.d/

[root@k8s-node1 mnt]# dnf install kubectl-1.30.0 -y

设置kubectl命令补齐功能

[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source ~/.bashrc

master节点拉取K8S所需镜像

[root@k8s-master ~]# kubeadm config images pull \

 --image-repository  registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.30.0 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.30.0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.11.1
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.12-0

[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' \
| awk -F "/" '{system("docker tag "$0" reg.timinglee.org/k8s/"$3)}'
[root@k8s-master ~]#  docker images | awk '/k8s/{system("docker push "$1":"$2)}'

集群初始化  

重置

[root@k8s-master ~]# kubeadm reset  --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-master ~]#  vim /lib/systemd/system/cri-docker.service

[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service root@172.25.254.10:/lib/systemd/system/cri-docker.service
root@172.25.254.10's password:
cri-docker.service                                                   100% 1399     1.8MB/s   00:00
[root@k8s-master ~]# scp /lib/systemd/system/cri-docker.service root@172.25.254.20:/lib/systemd/system/cri-docker.service
root@172.25.254.20's password:
cri-docker.service                                                   100% 1399     1.0MB/s   00:00
[root@k8s-node1 mnt]# systemctl  daemon-reload
[root@k8s-node2 mnt]# systemctl  daemon-reload
[root@k8s-node1 mnt]# systemctl restart cri-docker
[root@k8s-node2 mnt]# systemctl restart cri-docker
[root@k8s-master ~]# kubeadm init --pod-network-cidr=192.188.0.0/16 --image-repository reg.timinglee.org/k8s --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock

没有指定主配置文件

[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source ~/.bash_profile

安装flannel网络插件

[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

节点扩容

[root@k8s-master ~]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token c202wd.b05ub6yzkg14uq9e --discovery-token-ca-cert-hash sha256:5d28bde22580b483456e98cefd7fc2d90f2c83f1bdef6960af38346f09abb6d9

[root@k8s-node1 mnt]#  kubeadm join 172.25.254.100:6443 --token c202wd.b05ub6yzkg14uq9e --discovery-token-ca-cert-hash sha256:5d28bde22580b483456e98cefd7fc2d90f2c83f1bdef6960af38346f09abb6d9  --cri-socket=unix:///var/run/cri-dockerd.sock

检测

[root@k8s-master ~]#  kubectl run nginx --image nginx
pod/nginx created

k8s集群出问题如何解决

[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.timinglee.org/k8s --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock

安装flannel网络插件

[root@k8s-master ~]# vim kube-flannel.yml

[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

[root@k8s-node1 ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-node1 ~]# kubeadm join 172.25.254.100:6443 --token jspx26.624foiqnjowps9es \
        --discovery-token-ca-cert-hash sha256:950191de3ce58a9bd00f50e63e3b539a098840722e407279bb046967270603de --cri-socket=unix:///var/run/cri-dockerd.sock

对于在CentOS 7上部署Kubernetes(k8s),可以按照以下步骤进行安装: 1. 首先,确保你的CentOS 7系统是最新的,并且具备互联网连接。 2. 安装Docker:Kubernetes需要使用Docker作为容器运行时。可以通过以下命令来安装Docker: ``` sudo yum install -y docker sudo systemctl start docker sudo systemctl enable docker ``` 3. 安装kubeadm、kubelet和kubectl:这些是Kubernetes的核心组件。可以通过以下命令来安装: ``` sudo yum install -y kubelet kubeadm kubectl sudo systemctl enable kubelet ``` 4. 关闭SELinux:Kubernetes在CentOS上需要禁用SELinux。可以通过编辑`/etc/selinux/config`文件并将`SELINUX=enforcing`改为`SELINUX=disabled`来关闭SELinux。然后,重新启动系统。 5. 配置Kubernetes Master节点:选择一个主机作为Kubernetes Master节点,并执行以下命令: ``` sudo kubeadm init --pod-network-cidr=10.244.0.0/16 ``` 6. 设置Kubernetes配置:在完成上一步后,将会显示一些关于配置Kubernetes集群的命令。请按照提示将这些命令复制并在Terminal中执行。 7. 安装网络插件:Kubernetes需要一个网络插件来为容器提供网络功能。常用的网络插件有Flannel、Calico等。选择一个适合你的网络插件,并按照其文档进行安装。 8. 加入Worker节点:如果你想将其他主机加入到Kubernetes集群中作为Worker节点,可以使用在Master节点初始化时显示的`kubeadm join`命令。 完成上述步骤后,你就成功在CentOS 7上部署了一个基本的Kubernetes集群。你可以使用`kubectl`命令来管理和操作你的集群。务必参考官方文档和相关教程以获取更多详细信息和最佳实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

보고.싶다

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值