K8S介绍---搭建集群

Kubernetes介绍

官网:https://kubernetes.io/

一、应用部署方式演变

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

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

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

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

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

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

3、容器化部署:与虚拟化类似,但是共享了操作系统

优点:可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等。

运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦。

容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署。

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

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

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

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

Swarm:docker自己的容器编排工具

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

Kubernetes:google开源的容器编排工具

二、kubernetes简介

Kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器---Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第二个正式版本。

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

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

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

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

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

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

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

三、kubernetes组件

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

Master:集群的控制平面,负责集群的决策(管理)

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

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

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

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

Node:集群的数据平面,负责为容器提供运行环境(干活)

Kubelet:负责维护容器的生命周期,即通过控制docker来创建、更新、销毁容器

Docker:负责节点上容器的各种操作

下面以部署一个nginx服务来说明kubernetes系统各个组件的调用关系:

1、首先要明确,一旦kubernetes环境启动之后,master和node都会想自身的信息存储导etcd数据库中

2、一个nginx服务的安装请求会首先被发送到master节点的apiserver组件

3、Apiserver组件会调用scheduler组件来决定到底应该把这个服务安装导哪个node节点上

4、Apiserver调用controller-manager去调度node节点安装nginx服务

5、Kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod,pod是kubernetes的最小操作单元,容器必须跑在pod中

一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理,这样外界用户就可以访问集群中的nginx服务了。

四、kubernetes概念

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

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

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

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

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

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

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

K8s集群环境搭建

一、环境规划

1、集群类型

Kubernetes集群大体上分为两类:一主多从和多主多从

一主多从:一台master节点和多台node节点,搭建简单,但是有单机故障风险,适用于测试环境

多主多从:多台master节点和多台node节点,搭建麻烦,安全性高,适用于生产环境

2、安装方式

Kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包

1、Minikube:一个用于快速搭建单节点kubernetes的工具

2、Kubeadm:一个用于快速搭建kubernetes集群的工具,https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

3、二进制包:从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效,https://github.com/kubernetes/kubernetes

说明:现在需要安装kubernetes的集群环境,但是又不想过于麻烦,所有选择使用kubeadm方式

3、主机规划

python 复制代码
角色         ip地址                          组件
master:192.168.100.111    docker,kubectl,kubeadm,kubelet
node1: 192.168.100.112    docker,kubectl,kubeadm,kubelet
node2: 192.168.100.114    docker,kubectl,kubeadm,kubelet

二、环境搭建

本次环境搭建需要安装三台Linux系统(一主二从),内置centos8系统,然后在每台linux中分别安装docker。kubeadm(1.25.4),kubelet(1.25.4),kubectl(1.25.4).

1、主机安装

安装虚拟机过程中注意下面选项的设置:

1、操作系统环境:cpu2个 内存2G 硬盘50G Rocky Linux9

2、语言:中文简体/英文

3、软件选择:基础设施服务器

4、分区选择:自动分区/手动分区

5、网络配置:按照下面配置网络地址信息

网络地址:192.168.100.(111、112、114)

子网掩码:255.255.255.0

默认网关:192.168.100.254

DNS:8.8.8.8

6、主机名设置:

Master节点:master

Node节点:node1

Node节点:node2

1.1禁用firewalld、selinux、postfix(三个节点都做)

python 复制代码
systemctl stop firewalld
systemctl disable firewalld
 

vim /etc/selinux/config
SELINUX=disabled

setenforce 0

systemctl stop postfix
systemctl disable postfix

2、主机名解析 (三个节点都做)

python 复制代码
[root@master ~]# vim /etc/hosts 
//在该文件最后写入主机ip及主机名
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.111  master
192.168.100.112  node1
192.168.100.114  node2

//直接传输到两台从节点
[root@master ~]# scp /etc/hosts root@192.168.100.112:/etc/hosts
[root@master ~]# scp /etc/hosts root@192.168.100.114:/etc/hosts

3、下载工具包,时间同步(三个节点都做)

python 复制代码
//三台主机都是一样的操作
[root@master ~]# yum -y install chrony lrzsz tar wget
[root@master ~]# systemctl restart chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# hwclock -w

4、禁用swap分区(三个节点都做)

python 复制代码
[root@master ~]# vim /etc/fstab
//注释掉swap分区那一行

[root@master ~]# swapoff -a
[root@master ~]# free -m

5、开启IP转发,和修改内核信息---(三个节点都做)

python 复制代码
[root@master ~]# vim /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

[root@master ~]# modprobe   br_netfilter
[root@master ~]# sysctl -p  /etc/sysctl.d/k8s.conf

6、配置IPVS功能(三个节点都做)

python 复制代码
Rockylinux9中
/etc/modules-load.d/ipvs.modules这个文件
[root@master ~]# vim /etc/modules-load.d/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh

[root@master ~]# chmod +x /etc/modules-load.d/ipvs.modules
[root@master ~]# bash /etc/modules-load.d/ipvs.modules
[root@master ~]# lsmod | grep -e ip_vs 
[root@master ~]# reboot
6.1、ipvs功能开机自启(三个节点都做)
python 复制代码
[root@master ~]# vim /etc/systemd/system/ipvs.service
[Unit]
Description=Run a Custom Script at Startup
After=default.target

[Service]
ExecStart=/etc/modules-load.d/ipvs.modules

[Install]
WantedBy=default.target

[root@master ~]# systemctl daemon-reload 
[root@master ~]# systemctl enable ipvs
                       

注:这里做完最好留个快照

7、切换docker镜像源(三个节点都做)

python 复制代码
//这里使用的是阿里源
yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

8、安装docker-ce(三个节点都做)

python 复制代码
[root@master ~]# yum -y install docker-ce-25.0.5-1.el9
[root@master ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": [   "https://dockerpull.com",
        "https://docker.anyhub.us.kg",
        "https://dockerhub.jobcher.com",
        "https://dockerhub.icu",
        "https://docker.awsl9527.cn"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

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


//最后在master节点测试能否pullnginx镜像
[root@master ~]# docker pull nginx
[root@master ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    39286ab8a5e1   5 weeks ago   188MB

9、下载并解压cri-docker(三个节点都做)

python 复制代码
[root@master ~]# wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9.amd64.tgz
python 复制代码
[root@master ~]# tar -xvf cri-dockerd-0.3.9.amd64.tgz --strip-components=1 -C /usr/local/bin/

10、下载并编辑cri-docker service文件

python 复制代码
[root@master01 ~]# wget -O /etc/systemd/system/cri-docker.service https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
[root@master01 ~]# wget -O /etc/systemd/system/cri-docker.socket https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket

//查看是否下载成功
[root@master ~]# ll /etc/systemd/system/ | grep cri-docker
-rw-r--r--  1 root root 1319 Sep 21 10:44 cri-docker.service
-rw-r--r--  1 root root  204 Sep 21 10:45 cri-docker.socket

修改cri-docker.service文件

python 复制代码
[root@master ~]# vim /etc/systemd/system/cri-docker.service 
//修改ExecStart行内容为
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --cri-dockerd-root-directory=/var/lib/docker

修改cri-docker.socket文件

python 复制代码
[root@master ~]# vim /etc/systemd/system/cri-docker.socket 
//修改ListenStream行内容为
ListenStream=/var/run/cri-dockerd.sock

11、将修改后的文件分别传到node1、node2节点

python 复制代码
[root@master ~]# scp /etc/systemd/system/cri-docker.s* root@node1:/etc/systemd/system/
[root@master ~]# scp /etc/systemd/system/cri-docker.s* root@node2:/etc/systemd/system/

12、启动cri-docker并设置自启动(三个节点都做)

python 复制代码
[root@master ~]# systemctl daemon-reload 
[root@master ~]# systemctl restart cri-docker
[root@master ~]# systemctl enable cri-docker

三、部署kubernetes集群

1、配置阿里云k8s源(三个节点都做)

python 复制代码
[root@master ~]# vi /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key

2、安装集群所需软件包kubelet kubeadm kubectl(三个节点都做)

python 复制代码
[root@master ~]# yum install -y kubelet kubeadm kubectl

3、配置k8s Cgoup控制组(三个节点都做)

python 复制代码
[root@master ~]# vim /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

4、配置kubelet自启动,并初始化集群(三个节点都做)

python 复制代码
[root@master ~]# systemctl restart kubelet.service 
[root@master ~]# systemctl enable kubelet.service 

5、master节点打印文件

python 复制代码
//master节点所需的镜像文件
[root@master ~]# kubeadm config images list
//打印集群初始化配置文件
[root@master ~]# kubeadm config print init-defaults > kubeadm-config.yaml

6、master节点修改kubeadm参数

python 复制代码
[root@master ~]# vim kubeadm-config.yaml
...
localAPIEndpoint:
 advertiseAddress: 192.168.100.111 #修改,集群初始化的主节点IP
 bindPort: 6443
nodeRegistration:
 criSocket: unix:///var/run/cri-dockerd.sock #修改使用docker
 imagePullPolicy: IfNotPresent
 name: master  #修改节点名称
 taints: null
...
...
...
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #修改使用阿里云镜像仓库

7、使用配置文件初始化并配置环境变量

python 复制代码
[root@master ~]# yum -y install socat

//配置环境变量
[root@master ~]# vim /etc/profile.d/k8s.sh
export KUBECONFIG=/etc/kubernetes/admin.conf

[root@master ~]# source /etc/profile.d/k8s.sh 
[root@master ~]# scp /etc/profile.d/k8s.sh root@node1:/etc/profile.d/
[root@master ~]# scp /etc/profile.d/k8s.sh root@node2:/etc/profile.d/

[root@master ~]# scp /etc/kubernetes/admin.conf root@node1:/etc/kubernetes/                                                                        
[root@master ~]# scp /etc/kubernetes/admin.conf root@node2:/etc/kubernetes/

//最后node1与node2节点都source一下
[root@node1 ~]# source /etc/profile.d/k8s.sh
[root@node2 ~]# source /etc/profile.d/k8s.sh

8、工作节点加入集群(node1节点、node2节点执行)

python 复制代码
[root@node1 ~]# kubeadm join 192.168.100.111:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:002216bd98b4154ef6740dc6a2d42d83ba0e9ee3b99c7710461cdca4afd0a904 --cri-socket=unix:///var/run/cri-dockerd.sock

//master节点查看
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE   VERSION
master   NotReady   control-plane   41m   v1.28.14
node1    NotReady   <none>          65s   v1.28.14
node2    NotReady   <none>          8s    v1.28.14

9、下载calico文件

python 复制代码
[root@master ~]# wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml

10、创建calico网络(master节点)

python 复制代码
[root@master ~]# kubectl apply -f calico.yaml
python 复制代码
//查看容器的创建信息,状态都为Running才可以
[root@master ~]# kubectl get pod -n kube-system
NAME                                      READY   STATUS    RESTARTS      AGE
calico-kube-controllers-9d57d8f49-v96ft   1/1     Running   0             2m41s
calico-node-cl9xq                         1/1     Running   0             2m41s
calico-node-d2hvj                         1/1     Running   0             2m41s
calico-node-r9kcm                         1/1     Running   0             2m41s
coredns-6554b8b87f-44pf6                  0/1     Running   0             60m
coredns-6554b8b87f-kmtcx                  1/1     Running   0             60m
etcd-master                               1/1     Running   1 (46m ago)   60m
kube-apiserver-master                     1/1     Running   1 (46m ago)   60m
kube-controller-manager-master            1/1     Running   1 (46m ago)   60m
kube-proxy-g96gn                          1/1     Running   0             20m
kube-proxy-zl9cd                          1/1     Running   0             19m
kube-proxy-zrqwk                          1/1     Running   1 (46m ago)   60m
kube-scheduler-master                     1/1     Running   1 (46m ago)   60m

//查看网络状态
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   61m   v1.28.14
node1    Ready    <none>          21m   v1.28.14
node2    Ready    <none>          20m   v1.28.14

11、使用k8s集群创建一个pod,运行nginx容器,然后进行测试

master节点操作

python 复制代码
[root@master ~]# kubectl create deployment nginx --image nginx
deployment.apps/nginx created
[root@master ~]# kubectl  expose  deployment  nginx  --port 80  --type NodePort
service/nginx exposed
[root@master ~]# kubectl  get  pods  -o  wide
NAME                     READY   STATUS              RESTARTS   AGE   IP       NODE    NOMINATED NODE   READINESS GATES
nginx-7854ff8877-jgk4b   0/1     ContainerCreating   0          53s   <none>   node1   <none>           <none>
相关推荐
FGGIT2 小时前
使用Docker快速本地部署RSSHub结合内网穿透访问RSS订阅源
运维·docker·容器
豆包MarsCode3 小时前
使用豆包MarsCode 实现高可用扫描工具
大数据·人工智能·python·云原生·容器
li3714908903 小时前
生产k8s 应用容器内存溢出OOMKilled问题处理
docker·容器·kubernetes
SelectDB3 小时前
飞轮科技携手观测云亮相云栖大会,全方位展示阿里云数据库 SelectDB 版核心优势
数据库·云原生·云计算
007php0074 小时前
在Kubernetes中部署PHP项目的完整指南
学习·云原生·容器·架构·golang·kubernetes·php
莫得等待5 小时前
k8s的一些命令
docker·容器·kubernetes
程序那点事儿5 小时前
CentOS 7 中安装 docker 环境
运维·docker·容器
运维有术7 小时前
一文搞定!在 Kubernetes 集群上部署主从复制 MySQ
云原生·kubernetes
生信圆桌7 小时前
在 Docker 版 RStudio 中安装 Seurat V4 的完整教程 (同样适用于普通R环境安装)
docker·容器·r语言