官网:https://kubernetes.io/ 一组多个节点服务器的集群,每个节点运行特定的程序 1、优点: 自我修复:容器故障,迅速启动相同的新容器替补 弹性伸缩:根据需求,自动对集群中运行的容器数量进行调整 服务发现:服务自动寻找依赖的服务 负载均衡:同服务的多个容器自动实现负载均衡 版本回馈:新发布程序版本有问题,可以立即回退到原来版本 2、kubernetes组成 kubernetes集群组成:主控节点(master、集群的调度管理)、工作节点(node、工作) 3、kubernetes组件 master apiServer:集群统一入口,分发请求 scheduler:节点调度,安排节点部署应用 controller-manager:管理节点的资源应用 etcd:保存集群的数据 note kubelet:控制管理docker,管理容器 kube-proxy:代理应用对外访问 docker:容器操作 4、集群分类 一主多从:一个master和多个node,搭建简单,但有单机风险,只适用于测试环境 多主多从:多个master和多个node,搭建麻烦,安全性高,适用生产环境
搭建方式:minlkube、kubeadm、二进制包
minlkube:快速搭建单节点
kubeadm:快速搭建集群
二进制包:官网下载每个组件的二进制包,依次安装
硬件要求
三台服务器:master、node1、node2
2核CPU、2G内存
1、设置时间统一 chronyd
#设置时间
date -s "$(ssh [email protected] date)"
#查看时间
timedatectl
2、设置主机名
#设置主机名称
hostnamectl set-hostname 主机名
#查看主机名称
hostname
3、设置主机名解析
vi /etc/hosts
#添加以下内容:
192.168.80.219 master
192.168.80.215 node1
192.168.80.216 node2
或者
cat >> /etc/hosts << EOF
> 192.168.80.220 master
> 192.168.80.221 node1
> 192.168.80.222 node2
> EOF
4、验证多台主机是否连通
ping master
ping node1
ping node2
5、关闭防火墙
systemctl stop firewalld.service && systemctl disable firewalld.service
systemctl stop iptables && systemctl disable iptables
6、永久禁用selinux
vi /etc/selinux/config
#将如下行用#注释
SELINUX=enforcing
#添加如下内容
SELINUX=disabled
#查看selinux
cat /etc/selinux/config
7、永久关闭swap分区
vi /etc/fstab
#将如下行用#注释
/dev/mapper/centos-swap swap swap defaults 0 0
8、修改Linux内核参数
vi /etc/sysctl.d/k8s_better.conf
#添加如下内容
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
#重新加载配置
sysctl -p
9、加载网桥过滤模块
#加载网桥过滤模块
modprobe br_netfilter
#查看网桥过滤模块
lsmod |grep br_netfilter
10、配置IPVS功能
#安装IPset ipvsadmin
yum install ipset ipvsadm -y
#添加需要加载的模块写入脚本文件
cat > /etc/sysconfig/modules/ipvs.modules <
11、重启服务器
reboot
12、检查系统所有配置
getenforce && free -m
1、安装docker(具体安装已有)
#设置docker源
#docker默认cgroupdriver为cgroupfs,而kubernetes使用的是systemd,所以需要将docker修改为:systemd
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
#重启docker
systemctl restart docker
2、安装kubernetes
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#安装kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl
#配置kubelet
vi /etc/sysconfig/kubelet
#添加如下内容
#设置自启动
systemctl enable kubelet
安装的版本如图所示:
1、下载集群镜像
#查看kubernetes所需的镜像
[root@master ~]kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.23.1
k8s.gcr.io/kube-controller-manager:v1.23.1
k8s.gcr.io/kube-scheduler:v1.23.1
k8s.gcr.io/kube-proxy:v1.23.1
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6
#错误:
[root@node1 yum.repos.d]# docker pull k8s.gcr.io/kube-apiserver:v1.23.1
Error response from daemon: Get "https://k8s.gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
由于国内的网络无法从国外的k8s.gcr.io中下载镜像,但是可以从阿里云拉取,将镜像名修改为k8s对应的镜像名,最后删除阿里云的镜像
images=(
kube-apiserver:v1.23.1
kube-controller-manager:v1.23.1
kube-scheduler:v1.23.1
kube-proxy:v1.23.1
pause:3.6
etcd:3.5.1-0
coredns/coredns:v1.8.6
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
2、集群初始化
在master节点:
#初始化(根据实际情况的版本、ip)
kubeadm init --kubernetes-version=v1.23.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.80.219
在master节点:
#执行命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#部署flannel网络插件:只要在master安装,都会在每个node节点自动运行
wget kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
在node节点:
#集群增加node节点:每个node节点都执行以下命令
kubeadm join 192.168.80.219:6443 --token sml9ev.zy42q45tujhs1kyk \
--discovery-token-ca-cert-hash sha256:6c1e72cdc9dd56fb4425682e86085f7271202c36b7f699f75c827f3e8aeba5e7
#查看各个节点(每个节点的状态都是Ready即为部署成功)
kubectl get node
#查看组件
kubectl get pod -n kube-system -o wide
3、测试部署
#创建并启动nginx容器
kubectl create deployment nginx --images=nginx
#暴露容器端口
kubectl expose deployment nginx --port=80 --type=NodePort
#查看容器端口(在其中一个node节点可以看到nginx镜像,同时也看nginx容器)
kubectl get deployment,pod,service
4、问题解决
#问题1:
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
[ERROR Mem]: the system RAM (972 MB) is less than the minimum 1700 MB
#解决:这种错误一般都出现在虚拟机上,因为物理机或者虚拟机不满足Kubernetes的基础配置造成的,而Kubernetes对CPU要求至少是2核,2G内存,调整内核和内存,重启系统即可
#问题2:
[ERROR ImagePull]: failed to pull image k8s.gcr.io/coredns/coredns:v1.8.6
#解决:由于没有下载到这个k8s.gcr.io/coredns/coredns:v1.8.4镜像,同时它去官网又下载不了,这里有个坑,就是一般打的标签是k8s.gcr.io/coredns:v1.8.6,而新版本的要求是k8s.gcr.io/coredns/coredns:v1.8.6,所以重新改下标签即可
docker tag k8s.gcr.io/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
#问题3:
[kubelet-check] It seems like the kubelet isn't running or healthy
解决:
vi /etc/docker/daemon.json
#添加如下内容:
"exec-opts": ["native.cgroupdriver=systemd"]
#重启docker
systemctl restart docker
#问题4:
[ERROR Port-6443]: Port 6443 is in use
[ERROR Port-10251]: Port 10251 is in use
[ERROR Port-10252]: Port 10252 is in use
原因:由于K8S集群已进行过初始化主节点
解决:
#重启kubeadm
kubeadm reset
#初始化
kubeadm init --kubernetes-version=v1.23.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.80.219