云计算系列之Kubernetes(K8S)集群部署实战解析

内容导读

  • Kubernetes概述
  • Kubernetes集群的组件
  • Kubernetes集群的部署方式和工具
  • 使用部署工具创建Kubernetes集群

一、Kubernetes概述

1.1 什么是Kubernetes

Kubernetes:用于自动部署、扩缩和管理容器化应用程序的开源系统;

Kubernetes:简称为K8S或K8;

Docker:集装箱货轮;

Kubernetes:船舵(船的方向盘)。

1.2 为什么要使用Kubernetes

1、Kubernetes是业界领先的容器编排解决方案

(1)Mesos——Apache的开源分布式资源管理框架

由于大数据计算调度领域的局限性,Mesos只在特定的小范围使用。

(2)Docker Swarm——Docker原生集群解决方案

紧密集成到Docker的生态系统中,适合规模不大的应用程序环境。随着Docker企业版被Mirantis公司收购,Mirantis更倾向于编排工具Kubernetes,Docker Swarm面临被逐步淘汰的命运。

(3)Kubernetes——谷歌公司推出的开源容器集群管理系统

(4)具有超前的核心基础特性,构建与众不同的容器编排和管理的生态。

Kubernetes内部最底层最核心的Borg/Omega系统是使用golang语言重新设计开发的,并对外开源。发展成为容器编排和管理领域的事实标准。

2、使用Kubernetes具有极大的优势

(1)大大提升开发和运维复杂系统的人效。

(2)全面拥抱微服务架构,解决复杂业务系统的架构问题。

(3)随时随地将系统整体迁移到公有云上。

(4)利用Kubernetes服务弹性扩容机制轻松应对突发流量。

(5)系统架构具有横向扩容能力,便于在线完成集群扩容,在多个云环境中进行弹性伸缩。

1.3 Kubernetes的主要特性

1.4 Kubernetes与云原生

1、什么是云原生

微服务、DevOps、持续交付、容器化

2、云原生的代表技术

容器、服务网格、微服务、不可变基础设施、声明式API

3、云原生应用程序的特点

4、Kubernetes是云原生技术的基石

(1)Docker实现了容器的可移植、轻量化、虚拟化,为容器技术的普及作出了重要贡献。

(2)Kubernetes解决容器编排的全生命周期管理。

(3)CNCF致力于培育和维护开源生态系统来推广云原生技术,Kubernetes成为CNCF托管的第一个开源项目。

(4)作为管理云容器平台的工具,Kubernetes简化容器化应用程序的部署,成功解决了应用上云的效率和可移植性等问题,从而被称为云原生技术的基石。

(5)云原生的Kubernetes架构可以连续多次处理应用程序的部署。

二、Kubernetes集群的组件

2.1 控制平面组件

1、kube-apiserver——API服务器(API Server)负责公开Kubernetes API,处理接受请求的工作。

2、etcd——所有集群数据的后台数据库,持久化存储集群中所有的资源对象以及配置数据。

3、kube-scheduler——Kubernetes调度器(Scheduler)负责Pod在集群节点中的调度分配。

4、kube-controller-manager——Kubernetes控制器管理器(Controller Manager)负责运行控制器进程。

5、cloud-controller-manager——云控制器管理器(Cloud Controller Manager)利用云基础设施技术,在公有云、私有云或者混合云环境中运行Kubernetes。

2.2 工作节点组件

1、kubelet——在集群中每个节点上运行,是负责启动容器的重要的守护进程,用于保证容器在Pod中健康运行。

2、kube-proxy ——集群中每个节点上所运行的网络代理,是实现Kubernetes服务(Service)的通信与负载均衡机制的重要组件。

3、容器运行时(Container Runtime)——在Kubernetes集群的每个节点上运行,负责容器的整个生命周期。

2.3 功能插件

2.4 Docker容器组件

1、借鉴集装箱装运货物的思想,让开发人员将应用程序及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何运行Docker容器引擎的环境中,以容器形式来运行该应用程序。

2、Docker 是一个用于开发、发布和运行应用程序的开放平台。

3、Docker 重新定义了应用程序在不同环境中的移植和运行方式。

三、Kubernetes集群工具与部署方式

3.1 部署工具

minikube——搭建单节点的Kubernetes集群。

kubeadm ——快速部署一个Kubernetes集群,适用于生产环境快速部署。

kOps ——官方推出的Kubernetes运维工具,适用于生产环境ubernetes的安装、升级和管理。

Kubespray ——部署生产环境Kubernetes集群的工具。

以kubeadm工具为例:

命令

功能

kubeadm init

初始化(创建)控制平面节点

kubeadm join

创建工作节点并将其加入到集群中

kubeadm upgrade

将Kubernetes集群升级到新版本

kubeadm config

查看和处理Kubernetes配置信息,例如kubeadm config print init-defaults命令显示init命令配置,kubeadm config print join-defaults显示join命令配置,kubeadm config images pull命令根据配置文件拉取镜像,kubeadm config images list命令显示需要拉取的镜像

kubeadm token

管理kubeadm join命令所使用的令牌

kubeadm reset

还原通过kubeadm init或kubeadm join命令对节点进行的任何变更

kubeadm certs

管理Kubernetes证书

kubeadm kubeconfig

管理kubeconfig文件

kubeadm version

显示kubeadm的版本信息

3.2 二进制方式的集群部署

堆叠etcd拓扑结构一:

堆叠etcd拓扑结构二:

四、使用部署工具创建Kubernetes集群

4.1 规划Kubernetes集群

节点类型

主机名

IP地址

硬件配置

控制平面节点

master01

192.168.10.30

CPU:4核;内存:8GB;硬盘:60GB

工作节点

node01

192.168.10.31

CPU:2核;内存:4GB;硬盘:60GB

工作节点

node02

192.168.10.32

CPU:2核;内存:4GB;硬盘:60GB

4.2 准备Kubernetes集群安装环境

1、准备节点主机

[root@master01 ~]# hostnamectl set-hostname master01     # 修改主机名
[root@master01 ~]# bash                                  # 重新执行Shell使配置生效
[root@master01 ~]# nmcli connection show                 # 获取当前的网络连接信息
NAME    UUID                                  TYPE      DEVICE 
virbr0  3d081de7-b0f1-4105-ae59-645bb6163a1c  bridge    virbr0 
ens160  83daa21e-03bb-4cea-b286-d6a0fb6df711  ethernet  --  # 需配置的网络连接
[root@master01 ~]# nmcli connection modify ens160 ipv4.addr 192.168.10.30/24    ipv4.gateway 192.168.10.2  connection.autoconnect yes  ipv4.dns "192.168.10.2  114.114.114.114"                                                             # 修改网络连接配置
[root@master01 ~]# nmcli connection up ens160               # 激活网络连接使配置生效
# 连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3

2、配置主机名解析(/etc/hosts)

192.168.10.30  master01
192.168.10.31  node01
192.168.10.32  node02

3、禁用防火墙

 [root@master01 ~]#systemctl stop firewalld && systemctl disable firewalld

4、禁用SELinux

setenforce 0        # 临时禁用SELinux
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config 

5、关闭交换分区

swapoff –a                               # 临时关闭
sed -ri ‘s/.*swap.*/#&/’ /etc/fstab      # 重启后永久关闭

6、设置系统时间同步

# 修改/etc/chrony.conf配置文件
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp1.tencent.com iburst
server ntp2.tencent.com iburst
#重启chrony
systemctl restart chronyd.service

7、安装IPVS相关工具

(1)安装ipset和ipvsadm工具

yum install -y ipsetipvsadm

(2)编写/etc/sysconfig/modules/ipvs.modules脚本文件

#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack     # 如果内核版本低于4.18,则改用nf_conntrack_ipv4模块

(3)验证加载IPVS所需的模块

bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e -ip_vs -e nf_conntrack    # 查看相关的模块

8、安装containerd

(1)调整内核参数。

载入相关模块:

modprobe overlay
modprobe br_netfilter

编辑/etc/modules-load.d/containerd.conf文件:

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

使以上内核参数调整生效:

sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf

(2)下载containerd软件包。

wget https://github.com/containerd/containerd/releases/download/v1.6.8/cri-containerd-1.6.8-linux-amd64.tar.gz

(3)将该软件包解压缩到系统根目录中。

tar -zxvf cri-containerd-1.6.8-linux-amd64.tar.gz -C /

(4)修改/etc/containerd/config.toml配置文件。

SystemdCgroup = true
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://usydjf4t.mirror.aliyuncs.com","https://mirror.ccs.tencentyun.com","https://registry.docker-cn.com","http://h$
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["https://registry.cn-hangzhou.aliyuncs.com/google_containers"]

(5)启动containerd并设置为开机启动。

[root@master01 ~]# systemctl daemon-reload && systemctl enable containerd && systemctl start containerd

(6)查看containerd的版本信息进行验证。

[root@master01 ~]# crictl version
crictl version:  0.1.0
RuntimeName:  containerd
RuntimeVersion:  v1.6.8
RuntimeApiVersion:  v1

9、添加阿里云的Kubernetes软件源

创建/etc/yum.repos.d/kubernetes.repo文件

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
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

4.3 部署Kubernetes集群节点

1、配置节点主机的SSH互信

(1)执行ssh-keygen命令生成SSH公钥认证所需的公钥和私钥文件。

[root@master01 ~]# ssh-keygen

(2)将所生成的公钥发送到要免密登录的主机中。

[root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master01

(3)测试其中一台主机的免密SSH登录。

[root@master01 ~]# ssh node01
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Mon Nov 28 10:12:13 2022

(4)退出并注销

[root@node01 ~]# exit
Connection to node01 closed.

2、初始化控制平面节点

执行初始化命令:

[root@master01 ~]# kubeadminit --apiserver-advertise-address=192.168.10.30  --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.25.4   --service-cidr=10.96.0.0/12   --pod-network-cidr=10.244.0.0/16   --ignore-preflight-errors=all
[init] Using Kubernetes version: v1.25.4
Then you can join any number of worker nodes by running the following on each as root:                                   # 提示加入工作节点的命令(包括令牌值)
kubeadm join 192.168.10.30:6443 --token 51siix.szxjd53d406j615y \
--discovery-token-ca-cert-hash sha256:fb304dbb2075a3ae22b6e9c0a4b7008c86607099e4b0a207e18c7e98f237bdd4

3、为kubectl命令提供配置文件

[root@master01 ~]# mkdir -p $HOME/.kube
[root@master01 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 ~]# chown $(id -u):$(id -g) $HOME/.kube/config

4、将工作节点加入集群

[root@master01 ~]# ssh node01    # 免密登录到node01主机
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Mon Nov 28 21:40:02 2022
[root@node01 ~]# kubeadm join 192.168.10.30:6443 --token 51siix.szxjd53d406j615y 
--discovery-token-ca-cert-hash sha256:fb304dbb2075a3ae22b6e9c0a4b7008c86607099e4b0a207e18c7e98f237bdd4
[preflight] Running pre-flight checks
This node has joined the cluster:  # 提示此节点已成功加入到集群
[root@node01 ~]# exit              # 退出node01主机登录

4.4 安装Pod网络插件

1、从官网下载Calico插件安装用的配置文件calico.yaml。

2、修改calico.yaml文件。

- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"

3、应用calico.yaml配置文件,在集群中部署Calico插件(创建多种Kubernetes资源)。

[root@master01 ~]#  kubectl apply -f calico.yaml

4、查看名称空间kube-system下的所有Pod对象。

[root@master01 ~]#  kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS      AGE
calico-kube-controllers-798cc86c47-jrlhm   1/1     Running   0             11m

5、进一步查看Calico插件在各节点上的部署情况。

[root@master01 ~]#  kubectl get po -A -o wide | grep calico
kube-system   calico-kube-controllers-798cc86c47-jrlhm   1/1     Running   0             11m   10.88.0.2       node02     <none>           <none>
kube-system   calico-node-4bj7s                          1/1     Running   0             11m   192.168.10.32   node02     <none>           <none>
kube-system   calico-node-bqnzx                          1/1     Running   0             11m   192.168.10.30   master01   <none>           <none>
kube-system   calico-node-s7fsd                          1/1     Running   0             11m   192.168.10.31   node01     <none>           <none>

4.5 测试Kubernetes集群

1、创建一个简单的Deployment资源以运行Nginx。

[root@master01 ~]# kubectl create deployment nginx --image=nginx:1.8.1
deployment.apps/nginx created

2、将该Deployment资源发布为Service资源供外部访问。

[root@master01 ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

3、查看所创建的Pod和Service资源是否正常运行。

[root@master01 ~]#  kubectl get pod,svc
NAME                            READY   STATUS    RESTARTS   AGE
pod/nginx-cf797f6c5-s5lkq   1/1     Running   0          2m26s
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP         12h
service/nginx         NodePort    10.105.200.136   <none>       80:30820/TCP   56s

4、根据所暴露的节点端口访问所发布的Nginx服务器。

[root@master01 ~]# curl http://node02:30820
......
Thank you for using nginx.

4.6 使用containerd命令行工具crictl

1、查看节点上当前的镜像列表。

[root@master01 ~]#  crictl images
IMAGE                       TAG                 IMAGE ID              SIZE
docker.io/calico/cni     v3.24.5             628dd70880410       87.5MB
docker.io/calico/node    v3.24.5             54637cb36d4a1       81.6MB
......

2、查看节点上当前的容器列表。

[root@master01 ~]#  crictlps
CONTAINER           IMAGE             CREATED            STATE     NAME        ATTEMPT 
POD ID                  POD
75e3ecda6ac1a  54637cb36d4a1    26 minutes ago     Running      calico-node   0 
f6e1607c1c245       calico-node-bqnzx
......

更多精彩内容请关注本站! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值