Kubernetes集群搭建(kubeadm方式)

1、Kubernetes简介

官网: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,搭建麻烦,安全性高,适用生产环境

2、集群环境搭建-系统配置

搭建方式: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

3、集群环境搭建-组件安装

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

安装的版本如图所示:

Kubernetes集群搭建(kubeadm方式)_第1张图片

4、集群环境搭建-集群安装

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

Kubernetes集群搭建(kubeadm方式)_第2张图片

在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

Kubernetes集群搭建(kubeadm方式)_第3张图片

在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

你可能感兴趣的:(Linux,centos,docker,linux,centos,kubernetes,docker,云原生)