内容导读
- 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
......
更多精彩内容请关注本站!