一、概述
Kubernetes(简称K8S)是一个开源的容器编排和管理平台,是由Google发起并捐赠给Cloud Native Computing Foundation(CNCF)管理的项目。它的目标是简化容器化应用的部署、扩展、管理和自动化操作。
以下是Kubernetes的一些关键特性:
1、容器编排:Kubernetes可以管理和调度大规模的容器化应用程序。它能够确保应用程序在集群中的各个节点上正确启动和运行,并根据资源需求和可用性动态调整容器的数量和位置。
2、服务发现和负载均衡:Kubernetes提供了内建的服务发现机制,使得容器之间可以通过服务名来相互通信,而不需要硬编码IP地址或端口。同时,Kubernetes还支持负载均衡,自动将请求分发给可用的容器实例。
3、自动伸缩:Kubernetes能够根据应用程序的负载自动进行水平扩展,即增加或减少容器的数量,以满足应用程序的需求。这种自动伸缩可以基于CPU利用率、内存使用量等指标进行配置。
4、自愈性和故障恢复:Kubernetes具有自动故障检测和修复的能力。当容器或节点发生故障时,Kubernetes会自动重新启动容器、迁移容器到其他健康节点,或者按照指定的策略自动替换故障的节点。
5、云原生底层设施支持:Kubernetes与云原生应用开发和部署的理念紧密结合。它提供了对云平台的适配和整合,能够无缝地部署和管理应用程序到各种云服务提供商的基础设施上。
6、插件和扩展性:Kubernetes拥有丰富的插件和扩展机制,可以通过自定义资源或控制器来扩展和定制其功能。这使得开发者可以根据自己的需求,将Kubernetes与其他工具和平台进行整合。
Kubernetes广泛应用于企业和云服务提供商中,为容器化应用提供了灵活、可靠和可扩展的运行环境。它极大地简化了应用程序的部署和管理,提高了开发和运维的效率,成为云原生应用开发的重要基石之一。
二、工作原理
Kubernetes的工作原理可以分为以下几个关键组件和概念:
1. Master节点:Master节点是Kubernetes集群的控制中心,负责整个集群的管理和控制。它包含以下组件:
- API Server:提供集群的API接口,接收和处理用户和组件的请求。
- Scheduler:根据用户的需求和资源的可用性,决定将容器调度到集群中的哪个节点上。
- Controller Manager:负责监控和管理集群状态,包括自动伸缩、故障恢复等功能。
- etcd:保存集群的配置信息和状态数据,保证高可用和一致性。
2. Worker节点:Worker节点是集群中实际运行容器的节点,也称为Minion节点。每个Worker节点上都有以下组件:
- Kubelet:负责与Master节点通信,管理本节点上的容器和Pod。
- Container Runtime:用于运行容器的底层软件,如Docker。
- kube-proxy:负责网络代理和负载均衡,为容器提供网络服务。
3. Pod:Pod是Kubernetes的最小部署单元,可以包含一个或多个相关的容器。Pod是运行在Worker节点上的实际应用实例,它共享相同的网络和存储资源。每个Pod都有一个唯一的IP地址。
4. ReplicaSet和Deployment:ReplicaSet是Kubernetes中的一个控制器,用于创建和管理拥有相同配置和副本数量的Pod组。它确保指定数量的Pod运行,并在有需要时进行水平扩展或收缩。Deployment是对ReplicaSet的进一步封装,提供了应用程序的版本控制和滚动升级的能力。
5. Service:Service是通过标签选择器与一组Pod进行关联,并提供稳定的服务访问入口。Service可以实现负载均衡、内部服务发现和跨集群通信等功能。
Kubernetes的工作原理可以简要概括为:用户通过API Server与Master节点交互,创建、修改或删除资源对象(如Pod、ReplicaSet、Deployment等)。Master节点根据请求的内容进行相应操作,并将相应配置信息存储在etcd中。Kubelet监听Master节点的指令,在Worker节点上创建、管理和监控Pod的生命周期。kube-proxy负责处理网络请求,将请求转发到合适的Pod。
通过这种架构,Kubernetes可以动态地管理和调度容器化应用程序,实现高可用性、弹性伸缩和自动化操作。它提供了一种高级抽象的方式来描述应用程序和资源对象,并通过自动化和智能调度来确保应用程序的高效运行。
三、安装部署docker
注意:所有主机配置推荐CPU:2C+ Memory:2G+
1、主机初始化配置(所有主机都要配置)
所有主机配置禁用防火墙和selinux
setenforce 0
iptables -F
systemctl stop firewalld
systemctl disable firewalld
systemctl stop NetworkManager
systemctl disable NetworkManager
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
配置主机名并绑定hosts,不同主机名称不同
cat << EOF >> /etc/hosts
192.168.77.14 k8s-master
192.168.77.15 k8s-node01
192.168.77.16 k8s-node02
EOF
关闭交换分区
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
将IPv6的请求转发到IPv4
cat << EOF >> /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
查看
modprobe br_netfilter
sysctl -p
2、部署docker-ce环境
三台主机上分别部署 Docker 环境,因为 Kubernetes 对容器的编排需要 Docker 的支持(安装的版本是19.03.0)
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
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
yum clean all && yum makecache fast
yum -y install docker-ce-cli-19.03.3 containerd.io
systemctl start docker
systemctl enable docker
配置docker的阿里源
cat << END > /etc/docker/daemon.json
{
"registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END
systemctl daemon-reload
systemctl restart docker
四、安装部署Kubernetes集群
1、组件介绍
三个节点都需要安装下面三个组件
①、kubeadm:安装工具,使所有的组件都会以容器的方式运行
②、kubectl:客户端连接K8S API工具
③、kubelet:运行在node节点,用来启动容器的工具
2、配置阿里云yum源(所有主机)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
3、安装kubelet kubeadm kubectl(所有主机)
yum -y install kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0
systemctl enable kubelet
kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功
如果在命令执行过程中出现索引 gpg 检查失败的情况, 请使用 yum install -y --nogpgcheck kubelet kubeadm kubectl 来安装
4、配置init-config.yaml(只有主节点配置)
Kubeadm 提供了很多配置项,Kubeadm 配置在 Kubernetes 集群中是存储在ConfigMap 中的,也可将这些配置写入配置文件,方便管理复杂的配置项。Kubeadm 配内容是通过 kubeadm config 命令写入配置文件的。
kubeadm config print init-defaults > init-config.yaml
vim /root/init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.77.14 //master节点IP地址
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master //如果使用域名保证可以解析,或直接使用 IP 地址
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd //etcd 容器挂载到本地的目录
imageRepository: registry.aliyuncs.com/google_containers //修改为国内地址
kind: ClusterConfiguration
kubernetesVersion: v1.19.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 //新增加 Pod 网段
scheduler: {}
5、安装master节点
kubeadm config images list --config init-config.yaml 拉取镜像
kubeadm config images pull --config=init-config.yaml 下载镜像
echo "1" > /proc/sys/net/ipv4/ip_forward
kubeadm init --config=init-config.yaml //初始化安装K8S
下面红框中标注的是添加集群主节点的信息,给从指定主需要用到
kubectl 默认会在执行的用户家目录下面的.kube 目录下寻找config 文件,这里是将在初始化时[kubeconfig]步骤生成的admin.conf 拷贝到.kube/config
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
6、安装node节点
两个从节点指定主的信息
kubeadm join 192.168.77.14:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:910a7f7c25bcb32f88f28a66ccd142afa38188ee60d4807e9b8aac27b68a8a4d