k8s介绍及部署

目录

[一 Kubernetes 简介及部署方法](#一 Kubernetes 简介及部署方法)

[1.1 应用部署方式演变](#1.1 应用部署方式演变)

[1.2 容器编排应用](#1.2 容器编排应用)

[1.3 kubernetes 简介](#1.3 kubernetes 简介)

[1.4 K8S的设计架构](#1.4 K8S的设计架构)

[1.4.1 K8S各个组件用途](#1.4.1 K8S各个组件用途)

[1.4.2 K8S 各组件之间的调用关系](#1.4.2 K8S 各组件之间的调用关系)

[1.4.3 K8S 的 常用名词感念](#1.4.3 K8S 的 常用名词感念)

[1.4.4 k8S的分层架构](#1.4.4 k8S的分层架构)

[二 K8S集群环境搭建](#二 K8S集群环境搭建)

[2.1 k8s中容器的管理方式](#2.1 k8s中容器的管理方式)

[2.2 k8s 集群部署](#2.2 k8s 集群部署)

[2.2.1 k8s 环境部署说明](#2.2.1 k8s 环境部署说明)

[2.2.2 集群环境初始化](#2.2.2 集群环境初始化)

2.2.2.1.所有节点禁用swap和本地解析

2.2.2.2.所有节点安装docker

2.2.2.3.所有节点设定docker的资源管理模式为systemd

2.2.2.4.所有阶段复制harbor仓库中的证书并启动docke

[2.2.2.5 安装K8S部署工具](#2.2.2.5 安装K8S部署工具)

[2.2.2.6 设置kubectl命令补齐功能](#2.2.2.6 设置kubectl命令补齐功能)

[2.2.2.7 在所节点安装cri-docker](#2.2.2.7 在所节点安装cri-docker)

[2.2.2.8 在master节点拉取K8S所需镜](#2.2.2.8 在master节点拉取K8S所需镜)

[2.2.2.9 集群初始化](#2.2.2.9 集群初始化)

[2.2.2.10 安装flannel网络插件](#2.2.2.10 安装flannel网络插件)

[2.2.2.11 节点扩容](#2.2.2.11 节点扩容)


一 Kubernetes 简介及部署方法

1.1 应用部署方式演变

在部署应用程序的方式上,主要经历了三个阶段:

传统部署:互联网早期,会直接将应用程序部署在物理机上

  • 优点:简单,不需要其它技术的参与

  • 缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响

虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境

  • 优点:程序环境不会相互产生影响,提供了一定程度的安全性

  • 缺点:增加了操作系统,浪费了部分资源

Note:容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:

  • 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器

  • 当并发访问量变大的时候,怎么样做到横向扩展容器数量

1.2 容器编排应用

为了解决这些容器编排问题,就产生了一些容器编排的软件:

  • Swarm:Docker自己的容器编排工具

  • Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用

  • Kubernetes:Google开源的的容器编排工具

1.3 kubernetes 简介

  • 在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年

  • Borg系统运行管理着成千上万的容器应用。

  • Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。

  • Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。

kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器

  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整

  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务

  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡

  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本

  • 存储编排:可以根据容器自身的需求自动创建存储卷

1.4 K8S的设计架构

1.4.1 K8S各个组件用途

一个kubernetes集群主要是由控制节点(master) 、**工作节点(node)**构成,每个节点上都会安装不同的组件

1 master:集群的控制平面,负责集群的决策

  • ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制

  • Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

  • ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

  • Etcd :负责存储集群中各种资源对象的信息

2 node:集群的数据平面,负责为容器提供运行环境

  • kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理

  • Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)

  • kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡

1.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产生访问的代理

1.4.3 K8S 的 常用名词感念

  • Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

  • Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的

  • Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器

  • Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等

  • Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod

  • Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签

  • NameSpace:命名空间,用来隔离pod的运行环境

1.4.4 k8S的分层架构

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境

  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)

  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦

  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

  • Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等

  • Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等


二 K8S集群环境搭建

2.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程序的启动参数进行设置

2.2 k8s 集群部署

2.2.1 k8s 环境部署说明

K8S中文官网:Kubernetes

环境准备:

主机 角色 IP
k8s-master.exam.com master 集群控制节点 172.25.250.100
k8s-node1.exam.com worker 工作节点 172.25.250.10
k8s-node2.exam.com worker 工作节点 172.25.250.20
reg.exam.com harbor镜像仓库 172.25.250.250
  • 所有节点禁用selinux和防火墙

  • 所有节点同步时间和解析

  • 所有节点安装docker-ce

  • 所有节点禁用swap,注意注释掉/etc/fstab文件中的定义

2.2.2 集群环境初始化

所有k8s集群节点执行以下步骤

2.2.2.1.所有节点禁用swap和本地解析
复制代码
[root@k8s-master ~]# systemctl list-unit-files | grep swap

#关闭系统中所有的交换空间
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Feb 19 17:38:40 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=ddb06c77-c9da-4e92-afd7-53cd76e6a94a /boot                   xfs     defaults        0 0
#/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

本地解析

复制代码
[root@k8s-master ~]# vim /etc/hosts
172.25.250.100  k8s-master.exam.com
172.25.250.10   k8s-node1.exam.com
172.25.250.20   k8s-node2.exam.com
172.25.250.250  reg.exam.com
2.2.2.2.所有节点安装docker
复制代码
[root@k8s-master ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name=docker
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0

[root@k8s-master ~]# dnf install docker-ce -y
2.2.2.3.所有节点设定docker的资源管理模式为systemd
复制代码
[root@k8s-master ~]# vim /etc/docker/daemon.json
{
        "registry-mirrors": ["https://reg.westos.org"],
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
        "log-opts": {
                "max-size": "100m"
        },
        "storage-driver": "overlay2"
}
2.2.2.4.所有阶段复制harbor仓库中的证书并启动docke
复制代码
[root@k8s-master ~]# ls -l /etc/docker/certs.d/reg.exam.com/ca.crt
[root@k8s-master ~]# systemctl enable --now docker

#登陆harbor仓库
[root@k8s-master ~]# docker login reg.exam.com
[root@k8s-master ~]# docker info
Client: Docker Engine - Community
 Version:    27.1.2
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.16.2
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.29.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 27.1.2
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd			#资源管理更改为systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 8fc6bcff51318944179630522a095cc9dbf9f353
 runc version: v1.1.13-0-g58aa920
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 5.14.0-427.13.1.el9_4.x86_64
 Operating System: Red Hat Enterprise Linux 9.4 (Plow)
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 736.3MiB
 Name: k8s-master.exam.com
 ID: f3c291bf-287d-4cf6-8e69-5f21c79fa7c6
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://reg.exam.com/			#认证harbor仓库
 Live Restore Enabled: false
2.2.2.5 安装K8S部署工具
复制代码
#部署harbor软件仓库,添加k8s源
[root@k8s-master ~]# vim /etc/yum.repos.d/k8s.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm
gpgcheck=0

#检测网络是否连通

#安装软件
[root@k8s-master ~]# dnf install kubelet-1.30.0-150500.1.1 kubeadm-1.30.0-150500.1.1 kubectl-1.30.0-150500.1.1 --downloadonly --downloaddir=/mnt -y

[root@k8s-master mnt]# dnf install *.rpm -y
2.2.2.6 设置kubectl命令补齐功能
复制代码
[root@k8s-master ~]# dnf install bash-completion -y
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc 
[root@k8s-master ~]# source ~/.bashrc 
2.2.2.7 在所节点安装cri-docker

k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker

软件下载:GitHub - Mirantis/cri-dockerd: dockerd as a compliant Container Runtime Interface for Kubernetes

安装cri-docker插件

复制代码
[root@k8s-master ~]# dnf install libcgroup-0.41-19.el8.x86_64.rpm cri-dockerd-0.3.14-3.el8.x86_64.rpm -y

[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify

指定网络插件名称及基础容器镜像

复制代码
[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service 
#指定网络插件名称及基础容器镜像
...
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.exam.com/k8s/pause:3.9
...
--network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.9

[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl start cri-docker
[root@k8s-master ~]# ll /var/run/cri-dockerd.sock
srw-rw---- 1 root docker 0  8月 26 22:14 /var/run/cri-dockerd.sock		#cri-dockerd的套接字文件
2.2.2.8 在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

上传镜像到harbor仓库

复制代码
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' \
| awk -F "/" '{system("docker tag "$0" reg.exam.com/k8s/"$3)}'

[root@k8s-master ~]# docker images  | awk '/k8s/{system("docker push "$1":"$2)}'
2.2.2.9 集群初始化
复制代码
#启动kubelet服务
[root@k8s-master ~]# systemctl status kubelet.service
[root@k8s-master docker]# systemctl start kubelet.service 

#执行初始化命令
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository=reg.exam.com/k8s \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock

kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository=reg.exam.com/k8s --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock


#初始化报错 重新初始化
一定注意IP使用默认10.244.0.0
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock


--------------------------------------------------
#指定集群配置文件变量
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

[root@k8s-master ~]# source ~/.bash_profile

#当前节点没有就绪,因为还没有安装网络插件,容器没有运行
[root@k8s-master ~]# kubectl get nodes
[root@k8s-master ~]# kubectl get pod -A

Note:在此阶段如果生成的集群token找不到了可以重新生成

复制代码
[root@k8s-master ~]#   kubeadm token create --print-join-command
kubeadm join 172.25.250.100:6443 --token 5hwptm.zwn7epa6pvatbpwf --discovery-token-ca-cert-hash sha256:52f1a83b70ffc8744db5570288ab51987ef2b563bf906ba4244a300f61e9db23
2.2.2.10 安装flannel网络插件

官方网站:GitHub - flannel-io/flannel: flannel is a network fabric for containers, designed for Kubernetes

复制代码
#下载flannel的yaml部署文件
[root@k8s-master ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

[root@k8s-master ~]# curl -L -o kube-flannel.yml https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml


#下载镜像:
[root@k8s-master ~]# docker pull docker.io/flannel/flannel:v0.25.5

[root@k8s-master ~]# docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1

##新建仓库并上传到仓库
[root@k8s-master ~]# docker tag flannel/flannel:v0.25.5 \
reg.exam.com/flannel/flannel:v0.25.5

[root@k8s-master ~]# docker push reg.exam.com/flannel/flannel:v0.25.5

[root@k8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 \
reg.exam.com/flannel/flannel-cni-plugin:v1.5.1-flannel1

[root@k8s-master ~]# docker push reg.exam.com/flannel/flannel-cni-plugin:v1.5.1-flannel1


#编辑kube-flannel.yml 修改镜像下载位置
[root@k8s-master ~]# vim kube-flannel.yml

#需要修改以下几行 
[root@k8s-master ~]# grep -n image kube-flannel.yml
146:        image: flannel/flannel:v0.25.5
173:        image: flannel/flannel-cni-plugin:v1.5.1-flannel1
184:        image: flannel/flannel:v0.25.5

#安装flannel网络插件
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
2.2.2.11 节点扩容

在所有的worker节点中

1 确认部署好以下内容

2 禁用swap

3 安装:

  • kubelet-1.30.0

  • kubeadm-1.30.0

  • kubectl-1.30.0

  • docker-ce

  • cri-dockerd

  • 4 修改cri-dockerd启动文件添加

    5 启动服务

    • kubelet.service

    • cri-docker.service

    以上信息确认完毕后即可加入集群

    复制master生成的token 再加上插件参数
    [root@k8s-node1 & 2 ~]# kubeadm join 172.25.250.100:6443 --token pvtgvf.dgrw07jzfyykyxwr --discovery-token-ca-cert-hash sha256:b4b3d322be5d756177f4b38755b753393a81d9cd266370d193cbd610d32b4a28 --cri-socket=unix:///var/run/cri-dockerd.sock

Ready就是集群部署好了!

复制代码
可能会遇到插件问题
[root@k8s-master ~]# kubectl get  pods --all-namespaces 
NAMESPACE      NAME                                          READY   STATUS                  RESTARTS   AGE
kube-flannel   kube-flannel-ds-4dkn8                         0/1     Init:ImagePullBackOff   0          9m29s
kube-flannel   kube-flannel-ds-6bg6b                         0/1     Init:ImagePullBackOff   0          54m
kube-flannel   kube-flannel-ds-xbjlk                         0/1     Init:ImagePullBackOff   0          9m29s

重新初始化
[root@k8s-master ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock 

kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.exam.com/k8s --kubernetes-version v1.30.0 --cri-socket=unix:///var/run/cri-dockerd.sock

[root@k8s-master ~]# vim kube-flannel.yml
146: image: flannel/flannel:v0.25.5
173: image: flannel/flannel-cni-plugin:v1.5.1-flannel1
184: image: flannel/flannel:v0.25.5

[root@k8s-master ~]# kubectl apply -f kube-flannel.yml 

[root@k8s-master ~]# kubectl get nodes
NAME                  STATUS   ROLES           AGE   VERSION
k8s-master.exam.com   Ready    control-plane   38s   v1.30.0


#重新初始化
[root@k8s-node1,2 ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock 

kubeadm join 172.25.250.100:6443 --token 8mstsi.kvb94ivl2pivcjvr \
	--discovery-token-ca-cert-hash sha256:1ccb1ee51389bdcff6356a6bacf982578b41cc023689a03b7cf69424e2929557 --cri-socket=unix:///var/run/cri-dockerd.sock

[root@k8s-master ~]# kubectl -n kube-flannel get pods 

测试:

复制代码
#建立一个pod
[root@k8s-master ~]# kubectl run test --image nginx

#查看pod状态
[root@k8s-master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
test   1/1     Running   0          6m29s

#删除pod
[root@k8s-master ~]# kubectl delete pod test 
pod "test" deleted
相关推荐
JanelSirry7 分钟前
微服务是不是一定要容器化(如 Docker)?我该怎么选
docker·微服务·架构
小屁不止是运维13 分钟前
k8s问题详解1:k8s集群上传文件过大导致413 Request Entity Too Large(请求文件实体过大)
docker·容器·kubernetes
東雪蓮☆15 分钟前
K8s Ingress 详解与部署实战
linux·运维·kubernetes
聆风吟º1 小时前
无需 VNC / 公网 IP!用 Docker-Webtop+cpolar,在手机浏览器远程操控 Linux
linux·运维·docker
ZLRRLZ1 小时前
【Docker】Docker镜像仓库
docker·容器
知白守黑2675 小时前
docker资源限制
运维·docker·容器
无妄无望8 小时前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
爱宇阳10 小时前
禅道社区版 Docker Compose 服务迁移教程
运维·docker·容器
xzl0411 小时前
docker运行Ubuntu22.04
docker
能不能别报错11 小时前
K8s学习笔记(十九) K8s资源限制
笔记·学习·kubernetes