2.K8s集群搭建

搭建方案

minikube:轻量化的Kubernetes集群,为了能够更好学习和体验k8s功能而推出的,借助个人PC的虚拟化环境就可以实现Kubernetes的搭建

kubeadm :是一个 k8s 部署工具,用于快速部署 Kubernetes 集群。

二进制安装:如果想更容易可控,步骤繁琐,推荐使用二进制包部署,也可以通过shell,ansible,saltstack部署
例如:开源项目kubeasz 使用Ansible脚本安装K8S集群

yum安装:简单适合学习用,版本可能不是最新的

源码编译安装:难度大

实际生产中主要用二进制安装和kubeadm


kubeadm搭建

1.准备服务器三台

k8smaster 	192.168.10.13	2核、2G、30G
k8snode1	192.168.10.11	 2核、2G、30G
k8snode2	192.168.10.12	 2核、2G、30G

2.系统环境准备

centos7
docker 20+
k8s 1.23.6

3.搭建步骤

1.系统初始化操作

2.所有节点安装基础软件
安装 Docker
添加阿里云 yum 源 
安装kubeadm、kubelet、kubectl

3.部署Kubernetes Master

4.加入 Kubernetes Node

5.部署 CNI 网络插件 

6.测试 kubernetes 集群

系统初始化操作

在各节点执行以下初始化操作

1.关闭防火墙
关闭防火墙并且设置开机不启动

systemctl stop firewalld
systemctl disable firewalld

2.关闭SELINUX
关闭seLinux,getenforce是获取seLinux的状态
getenforce
直接修改文件,改为SELINUX=disabled,重启之后生效
vim /etc/selinux/config
或者
sed -i 's/enforcing/disabled/' /etc/selinux/config

3.关闭swap
临时关闭
swapoff -a
修改/etc/fstab文件永久关闭,将文件中/dev/mapper/centos-swap swap行注释即可,也可以直接运行下面这条命令
sed -i '/swap/ s/^\(.*\)$/#\1/g' /etc/fstab

sed -ri 's/.*swap.*/#&/' /etc/fstab

4.设置主机名
hostnamectl set-hostname k8smaster

5.修改hosts文件

192.168.10.13	k8smaster
192.168.10.11	k8snode1
192.168.10.12	k8snode2

6.做时间同步

yum install ntpdate -y 
ntpdate ntp.aliyun.com

如果时区不对

查看一下时区 
timedatectl 
设置时区为亚洲上海
timedatectl set-timezone Asia/Shanghai

设置半个小时同步一次
*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com &> /dev/null

7.修改内核参数以满足k8s的运行需求

cat > /etc/sysctl.d/k8s.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF

sysctl --system #重新加载,让上面的配置生效

8.安装docker
k8s 1.24版本已经放弃了docker作为容器运行时软件,要使用docker作为容器运行时软件,
要安装1.23以下的版本,然后k8s1.23版本支持的最新docker是20.10

安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

指定版本安装docker
yum install -y docker-ce-20.10.0 docker-ce-cli-20.10.0 containerd.io


----------------------------------------------------------------------------------------------------------------
查找Docker-CE的版本:
yum list docker-ce.x86_64 --showduplicates | sort -r

Loading mirror speeds from cached hostfile
 Loaded plugins: branch, fastestmirror, langpacks
docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
Available Packages

安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
sudo yum -y install docker-ce-[VERSION]

9.修改docker的默认cgroup引擎(修改完需要重启docker)
docker与k8s需要是同一个驱动,需要改为systemd

cat <<EOF > /etc/docker/daemon.json
{"registry-mirrors": [
                "https://hub-mirror.c.163.com",
                "https://docker.m.daocloud.io",
                "https://ghcr.io",
                "https://mirror.baidubce.com",
                "https://docker.nju.edu.cn",
                "https://lzlnfm7q.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

重启docker
systemctl restart docker

10.添加k8s 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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

11.建立 k8s YUM 缓存
yum makecache

12.查看可安装版本
yum list kubelet --showduplicates
在这里插入图片描述

13.安装CoreDNS,每个节点执行一次
在集群内提供DNS服务

docker pull coredns/coredns:1.8.6
docker tag coredns/coredns:1.8.6 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.6
docker rmi coredns/coredns:1.8.0

14.安装kubeadm,kubelet,kubectl(指定版本)
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
在这里插入图片描述

15.设置kubelet开机自启动
systemctl enable kubelet


k8s Master节点初始化

k8s 初始化(在Master 节点执行)

kubeadm init \
--apiserver-advertise-address=192.168.10.13 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 
--pod-network-cidr=10.0.0.0/16 \

参数说明:

--apiserver-advertise-address  # 集群master节点地址
--image-repository             # 指定k8s镜像仓库地址
--kubernetes-version           # 指定K8s版本(与kubeadm、kubelet版本保持一致)
--service-cidr                 # Pod统一访问入口
--pod-network-cidr             # Pod网络(与CNI网络保持一致)


–pod-network-cidr设置时一定要注意,它不能与集群节点的地址在一个子网中
否则后续coredns状态始终处于0,无法正常运行

在这里插入图片描述

查看命令执行后的提示信息,看到 Your Kubernetes control-plane has initialized successfully!
说明我们 master 节点上的 k8s已经搭建成功。

查看命令执行后的提示信息,可以看到三条命令:
开启 kubectl 工具的使用(该命令在 master 节点中执行)。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

在这里插入图片描述

执行kubectl get node命令查看节点状态
在这里插入图片描述

kubectl get cs
查看服务组件的状态
在这里插入图片描述
apiserver,这里不展示,只要能看到这命令能正常响应,就说明apiserver服务是正常的


将node节点加入集群

在Kubernetes中,将新的节点(node)加入到现有的集群中,通常需要执行以下步骤:
确保新节点已安装Docker、kubelet、kubeadm和kubectl。
在主节点上,通过kubeadm token create命令创建一个加入令牌。
使用kubeadm token print-join-command命令获取加入集群的kubeadm命令。
在新节点上执行该命令。


1.登录master节点,获取加入命令
kubeadm token create --print-join-command

会输出类似以下格式的命令
kubeadm join <CONTROL_PLANE_IP>:<PORT> --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>

在这里插入图片描述

2.登录node节点
执行刚才生成的加入命令
在这里插入图片描述

如果在node节点上执行kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?

在这里插入图片描述
就执行一遍开启 kubectl 工具的命令

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果报
cannot stat ‘/etc/kubernetes/admin.conf’: No such file or directory

就将master节点上的该文件拷贝到node节点上去
scp /etc/kubernetes/admin.conf root@192.168.10.12:/etc/kubernetes/admin.conf

再执行kubectl get nodes 就可以看到新加入集群的节点了
在这里插入图片描述

同理,将其它的节点也加入到集群

在这里插入图片描述


安装网络插件Calico

节点为NotReady状态,因为完成互通还需要安装CNI(网络插件)

CNI 全称“Container Networking Interface”,即容器网络接口,它提供了一种标准的插件机制,用于连接容器到底层网络。

Flannel:一个简单易用的网络解决方案,支持多种部署模式。
Calico:一个高度可扩展的容器网络方案,旨在为大规模生产环境提供网络和安全性。
Weave Net:一个分布式的容器网络方案,具有良好的可扩展性和高度自动化的管理。

在master节点上安装网络插件的好处是,能直接在master节点上测试访问到node节点上的容器服务


在master节点运行

wget https://docs.projectcalico.org/v3.20/manifests/calico.yaml --no-check-certificate

vim /opt/calico.yaml
一定注意yaml文件格式

修改文件里面的定义Pod网络(CALICO_IPV4POOL_CIDR)的值,
要与前面master节点初始化时kubeadm init的–pod-network-cidr指定的一样
在这里插入图片描述

Cluster type to identify the deployment type
添加IP_AUTODETECTION_METHOD值为interface=ens33,ens33是网卡

- name: IP_AUTODETECTION_METHOD
  value: "interface=ens33"

在这里插入图片描述

apiVersion: policy/v1beta1改为apiVersion: policy/v1
在这里插入图片描述

网络原因,镜像下载速度较慢,如果直接执行
kubectl apply -f calico.yaml 时会受影响,可以提前在所有的节点上下载好镜像

docker pull docker.io/calico/pod2daemon-flexvol:v3.20.6
docker pull docker.io/calico/node:v3.20.6
docker pull docker.io/calico/kube-controllers:v3.20.6
docker pull docker.io/calico/cni:v3.20.6

部署
kubectl apply -f calico.yaml

后续不想用这个配置文件,可以卸载掉
kubectl delete -f calico.yaml

在这里插入图片描述

查看节点状态
都变成Ready状态了
在这里插入图片描述

查看pod信息
kubectl get po -n kube-system

kubectl get pods --all-namespaces
执行结束要等一会才能全部running
运行状态,1代表运行中

在这里插入图片描述


如果发现pod状态是 0,可以根据命令查看原因
kubectl describe pods -n kube-system pod-name

或查看以下这个pod的日志
kubectl logs pod-name -n kube-system

如果pod状态STATUS一直 ContainerCreating 的情况:

可以尝试卸载 master、node节点上所有 calico 的安装信息。然后重启kubelet

rm -rf /etc/cni/net.d/*
rm -rf /var/lib/cni/calico
systemctl restart kubelet

在这里插入图片描述


集群测试

在 Kubernetes 集群中部署nginx镜像,验证是否正常运行
在master节点上执行以下操作

kubectl create deployment nginx --image=nginx
在这里插入图片描述

对外暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
在这里插入图片描述
为nginx服务创建了service,然后暴露容器内80端口

查看暴露的端口信息
kubectl get pod,svc
80端口映射到了30340端口
在这里插入图片描述

发送请求
都可以正常访问,集群搭建完成

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值