Kubernetes

文章目录

  • Kubernetes
    • 1. Kubernetes简介
      • 1.1 Kubernetes介绍
      • 1.2 Kubernetes组件
      • 1.3 Kubernetes概念
    • 2. Kubernetes部署
      • 2.1 安装要求
      • 2.2 准备工作
      • 2.3 开始部署
        • 2.3.1 安装docker
        • 2.3.2 配置kubernetes阿里云YUM软件源
        • 2.3.3 安装kubeadm,kubelet和kubectl
        • 2.3.4 containerd配置
      • 2.4 部署Kubernetes-Master
      • 2.5 测试kubernetes集群

Kubernetes

1. Kubernetes简介

1.1 Kubernetes介绍

kubernetes,是一个全新的基于容器技术的分布式架构领先方案,为谷歌公司所研发。Kubernetes是一个开源的容器编排和管理系统,用于自动化部署、扩展和管理容器化应用程序。它提供了一种可靠且可扩展的方式来运行和管理容器化应用程序,使开发人员能够轻松地部署和管理应用程序的容器化部署。

Kubernetes的核心概念是集群,它由一组物理或虚拟机器组成,称为节点。每个节点运行著一个容器运行时环境,如Docker,用于运行容器。Kubernetes通过使用集群中的多个节点来分发和管理容器,并确保它们的状态和可用性。目的是为了实现自动化。

Kubernetes的主要功能如下:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷

1.2 Kubernetes组件

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

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

  • kube-apiserver: 提供Kubernetes API的接口和访问控制。接收用户输入的命令,提供认证、授权、API注册和发现等机制
  • kube-scheduler: 负责调度容器到集群中的节点上,按照预定的调度策略将Pod调度到相应的node节点上
  • etcd: 分布式键值存储系统,用于存储集群的配置数据。
  • ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

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

  • kubelet: 在每个节点上运行的代理,负责管理容器的生命週期和与Master的通信。
  • kube-proxy: 负责为集群中的服务提供网络代理和负载均衡功能。
  • 容器运行时(如Docker或Containerd): 负责在节点上容器的各种操作

附加组件:

  • kube-dns/coredns: 提供集群内部的DNS解析服务,用于服务发现和名称解析。

  • kube-dashboard: 提供Web界面用于集群的可视化管理和监控。

  • Ingress Controller: 负责处理集群外部流量的入口,并将流量路由到相应的服务。

  • Heapster/Metrics Server: 收集和暴露集群和容器的性能指标数据。

  • Horizontal Pod Autoscaler (HPA): 根据CPU等度量指标自动调整Pod副本数量。

  • Cluster Autoscaler: 根据节点资源的需求自动调整集群的节点数量。

  • Persistent Volume (PV) 和 Persistent Volume Claim (PVC): 用于管理持久化存储卷的声明和使用。

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

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

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

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

      在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer。

    4. apiServer调用controller-manager去调度Node节点安装nginx服务

    5. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod。

      pod是kubernetes的最小操作单元,容器必须跑在pod中至此,

    6. 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理。

    这样,外界用户就可以访问集群中的nginx服务了。

1.3 Kubernetes概念

  • Pod(荚舱):是Kubernetes的最小部署单位,它可以包含一个或多个相关的容器。Pod中的容器共享相同的网络命名空间、IP地址和存储卷。

  • 副本集(Replica Set):用于确保指定数量的Pod副本在集群中运行。如果Pod数量不足或Pod异常终止,副本集将自动创建或调整Pod的数量。

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

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

  • 服务(Service):用于定义一组Pod的访问方式。服务具有固定的IP地址和DNS名称,可以在集群内部或从集群外部访问应用程序。

  • 部署(Deployment):用于指定应用程序的部署配置,包括Pod模板、副本数量和更新策略。部署可以自动创建和管理相应的副本集。

  • 名称空间(Namespace):用于隔离和组织集群中的资源。不同的名称空间可以拥有相同名称的资源,并允许不同的团队或项目在集群中独立操作。

  • 标签(Label):是用于对资源进行标记和分类的键值对。

  • 控制器(Controller):Kubernetes中的控制器是用于监控和维护目标状态的组件。它们可以确保集群中的资源保持在目标状态,并根据需要进行调整。

2. Kubernetes部署

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。

这个工具能通过两条指令完成一个kubernetes集群的部署:

# 创建一个 Master 节点
$ kubeadm init

# 将一个 Node 节点加入到当前集群中
$ kubeadm join 

2.1 安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

-至少3台机器,操作系统 CentOS7+

  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘20GB或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区(这个是重点)

环境说明

主机名 ip 角色 系统版本
kiwi111 192.168.234.33 master CentOS8
kiwi222 192.168.234.123 node1 CentOS8
kiwi333 192.168.234.111 node2 CentOS8

2.2 准备工作

首先关闭swap分区,所有主机都要做

//临时关闭
swapoff -a

//永久关闭,关掉之后要重启主机
[root@kiwi111 ~]# vim /etc/fstab 
## 将下面一行删掉或者注释掉即可
#/dev/mapper/cs-swap     none                    swap    defaults        0 0

关闭防火墙以及修改selinux,所有主机都要做

[root@kiwi111 ~]# systemctl disable --now firewalld
[root@kiwi111 ~]# setenforce 0
[root@kiwi111 ~]# sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

在所有主机上添加hosts

[root@kiwi111 ~]# vim /etc/hosts 

192.168.234.33 kiwi111
192.168.234.123 kiwi222
192.168.234.111 kiwi333

将桥接的IPv4流量传递到iptables的链

//k8s.conf文件需要自己创建
[root@kiwi111 ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF


//执行下面这条命令生效
[root@kiwi111 ~]# sysctl --system

时间同步,所有主机要做

[root@kiwi111 ~]# yum -y install chrony
[root@kiwi111 ~]# systemctl enable --now chronyd

//master主机
[root@kiwi111 ~]# vim /etc/chrony.conf 
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool time1.aliyun.com iburst    ## 修改这一行

······························略

[root@kiwi111 ~]# systemctl restart chronyd

//设置时区
[root@kiwi111 ~]# timedatectl set-timezone Asia/Shanghai
[root@kiwi111 ~]# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6   367    16   -472us[ -299us] +/-   35ms


//node1主机
[root@kiwi222 ~]# vim /etc/chrony.conf 
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool kiwi111 iburst      ## 修改这一行

······························略

[root@kiwi222 ~]# systemctl restart chronyd
[root@kiwi222 ~]# timedatectl set-timezone Asia/Shanghai
[root@kiwi222 ~]#  chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? kiwi111                       0   6     0     -     +0ns[   +0ns] +/-    0ns


//node2主机
[root@kiwi333 ~]# vim /etc/chrony.conf 
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool kiwi111 iburst      ## 修改这一行

······························略

[root@kiwi333 ~]# systemctl restart chronyd
[root@kiwi222 ~]# timedatectl set-timezone Asia/Shanghai
[root@kiwi333 ~]#  chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? kiwi111                       0   6     0     -     +0ns[   +0ns] +/-    0ns

在master主机上配置免密登录

[root@kiwi111 ~]# ssh-keygen -t rsa
[root@kiwi111 ~]# ssh-copy-id kiwi111
[root@kiwi111 ~]# ssh-copy-id kiwi222
[root@kiwi111 ~]# ssh-copy-id kiwi333
[root@kiwi111 ~]# for i in kiwi111 kiwi222 kiwi333;do ssh $i 'date';done
Mon Nov 13 15:16:10 CST 2023
Mon Nov 13 15:16:10 CST 2023
Mon Nov 13 15:16:10 CST 2023

2.3 开始部署

Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

2.3.1 安装docker
//所有主机都要安装docker
[root@kiwi111 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@kiwi111 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@kiwi111 ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
[root@kiwi111 ~]# yum -y install docker-ce

//设置开机自启
[root@kiwi111 ~]# systemctl enable --now docker

//配置加速器
[root@kiwi111 ~]# mkdir -p /etc/docker
[root@kiwi111 ~]# tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ye25aygs.mirror.aliyuncs.com"]
}
EOF
[root@kiwi111 ~]# systemctl restart docker
2.3.2 配置kubernetes阿里云YUM软件源
//所有主机都要装

[root@kiwi111 ~]# cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF
2.3.3 安装kubeadm,kubelet和kubectl
//所有主机都要装
[root@kiwi111 ~]# yum install -y kubelet kubectl kubeadm

[root@kiwi222 ~]# yum install -y kubelet kubectl kubeadm

[root@kiwi333 ~]# yum install -y kubelet kubectl kubeadm


//设置开机自启,但先不要启动,如果是启动的一定要将它停止
[root@kiwi111 ~]# systemctl enable kubelet
2.3.4 containerd配置
//在所有主机上都要执行
[root@kiwi111 ~]# containerd config default > /etc/containerd/config.toml
[root@kiwi111 ~]# vim /etc/containerd/config.toml 
## 修改这一行
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
    
    
[root@kiwi111 ~]# systemctl restart containerd
[root@kiwi111 ~]# systemctl enable containerd

//将这个文件传给另外两个节点
[root@kiwi111 ~]# scp /etc/containerd/config.toml kiwi222:/etc/containerd/
   
[root@kiwi111 ~]# scp /etc/containerd/config.toml kiwi333:/etc/containerd/


//重启服务
[root@kiwi222 ~]# systemctl restart containerd
[root@kiwi222 ~]# systemctl enable containerd


//重启服务
[root@kiwi333 ~]# systemctl restart containerd
[root@kiwi333 ~]# systemctl enable containerd

2.4 部署Kubernetes-Master

以下操作在Master上执行

//初始化
[root@kiwi111 ~]# kubeadm init \
   --apiserver-advertise-address=192.168.234.33 \
   --image-repository registry.aliyuncs.com/google_containers \
   --kubernetes-version v1.28.2 \
   --service-cidr=10.96.0.0/12 \
   --pod-network-cidr=10.244.0.0/16
   
//将初始化后的结果保存到一个文件中
[root@kiwi111 ~]# cat kubernetes_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

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/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.234.33:6443 --token pi6f0o.e695bzkybrpbnnzp \
        --discovery-token-ca-cert-hash sha256:06fe292b51f5c9fd4884dde35f1b1eedc83b1e66358ca388bf252a00ca2c1fc7
        
 
//添加环境变量
[root@kiwi111 ~]# echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' > /etc/profile.d/kubernetes.sh


//配置网络
//安装pod网络插件
[root@kiwi111 ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
[root@kiwi111 ~]# kubectl apply -f kube-flannel.yml 

//查看是否运行成功
[root@kiwi111 ~]# kubectl get -f kube-flannel.yml 

将两台工作主机加入到这个集群中

//在两台node上执行
[root@kiwi222 ~]# kubeadm join 192.168.234.33:6443 --token pi6f0o.e695bzkybrpbnnzp \
        --discovery-token-ca-cert-hash sha256:06fe292b51f5c9fd4884dde35f1b1eedc83b1e66358ca388bf252a00ca2c1fc7
        

[root@kiwi333 ~]# kubeadm join 192.168.234.33:6443 --token pi6f0o.e695bzkybrpbnnzp \
>         --discovery-token-ca-cert-hash sha256:06fe292b51f5c9fd4884dde35f1b1eedc83b1e66358ca388bf252a00ca2c1fc7


//在master上查看是否加入成功
[root@kiwi111 ~]# kubectl get nodes
NAME      STATUS   ROLES           AGE     VERSION
kiwi111   Ready    control-plane   23m     v1.28.2
kiwi222   Ready    <none>          2m54s   v1.28.2
kiwi333   Ready    <none>          2m46s   v1.28.2

2.5 测试kubernetes集群

部署一个服务测试

[root@kiwi111 ~]# kubectl create deployment httpd --image=httpd
[root@kiwi111 ~]# kubectl expose deployment httpd --port=80 --type=NodePort
[root@kiwi111 ~]# kubectl get pods -o wide
NAME                     READY   STATUS             RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
apache-7c5f54c97-6l5rq   0/1     ImagePullBackOff   0          7m48s   10.244.2.5   kiwi333   <none>           <none>
httpd-5c98f79dfc-lvvlp   1/1     Running            0          26s     10.244.2.6   kiwi333   <none>           <none>
tomcat-c89f9dd5f-rhjhx   1/1     Running            0          11m     10.244.1.3   kiwi222   <none>           <none>


//验证是否部署成功
[root@kiwi111 ~]# curl 10.244.2.6
<html><body><h1>It works!</h1></body></html>

你可能感兴趣的:(kubernetes,容器,云原生)