搭建方案
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端口
发送请求
都可以正常访问,集群搭建完成