新手搭建K8S
环境准备
通过vmware 准备系统为centos7 的虚机三台 。(一台也可以,后面在克隆虚机也可以)安装vmware 虚机过程就不写了比较基础。
准备环境配置网络 我选择桥接模式。配置静态ip ,静态ip 可以ping通外网。(桥接模式下dhcp 获取的地址,我们取和他同一网段的地址配置给我们虚机就好了,确保取地址是未被使用的可以通过ping 检查)
我准备三台vm 的地址规划
master 192.168.0.50
node1 192.168.0.51
node2 192.168.0.52
吸引准备好后 对环境的设置
修改主机名
hostnamectl set-hostname +主机名
配置主机网络
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33-1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.0.50
PREFIX=24
GATEWAY=192.168.0.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=b1cac983-ca12-4acb-8e88-638e9ecda874
DEVICE=ens33
ONBOOT=yes
设置域名解析
[root@master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.50 master
192.168.0.51 node1
192.168.0.52 node2
手动修改 selinux 配置文件,设置永久关闭(需要重启动机器)
vi /etc/selinux/config
SELINUX=enforcing改为SELINUX=disabled
关闭iptables
systemctl stop iptables
systemctl disable iptables
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
检查server 是否可以ping 通外网 可以通过ping www.baidu.com
准备安装docker
添加aliyun 的yum 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
检查yum 源,此时出现的出来我们本机的yum 源 应该会多一个docker 的yum 源
yum makecache
安装docker
yum install -y docker-ce
启动docker 服务
systemctl start docker
systemctl enable docker
验证docker 是否ok,结果如下
docker run hello-world
如果提示docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: Running hook #0:: error running hook: exit status 2, stdout: , stderr: fatal error: runtime: out of memory
是虚机的内存不够,扩内存可以解决此问题我虚机是给了1G 扩至2G解决此问题
docker 是安装K8S 的前提,确保docker 的可用性我们在安装K8S
网络使用的goofle 的K8S yum 源国内用不了,我们需要切换成阿里的yum 源
在 /etc/yum.repos.d/ 目录下生产一个K8S 的yum 源
cat <<EOF > /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
执行yum makecache 检查
k8s 所需的组件: kubelet kubeadm kubectl
Kubelet 是运行在所有cluster 节点上的负责启动pod 和容器
Kubeadm 用于初始化cluster
Kubectl 是K8S 的命令行工具,用于管理和部署应用,负责查看、删除、创建 和更新组件
安装K8S 需要的组件 (所有节点上安装)
yum install -y kubelet kubeadm kubectl
可以使用kubectl version、 kubelet --version、 kubeadm version验证是否安装成功
如果做到这里如果大家使用的是一台虚机,现在可以将虚机克隆 需要几个node 节点克隆几个就可以了 然后修改ip hostname 即可
master 节点的操作
初始化master 节点
kubeadm init --pod-network-cidr=192.168.10.0/16 --apiserver-advertise-address=192.168.0.50
由于国内网络原因 在获取镜像会超时会提示如下报错
在根据网络上添加阿里云的镜像时虽然会减少镜像下载报错但是还是有问题
我们使用以下方法来彻底解决此问题
原文链接“https://blog.csdn.net/weixin_43168190/article/details/107227626”
在初始化master 时候会有提示让我们是使用 'kubeadm config images pull' 来提前知道image 的版本
我们直接从DockerHub的其它仓库拉取
https://hub.docker.com/search?q=kube-proxy&type=image
选取一个访问量最多的仓库来使用
编写下载镜像的脚本
[root@master ~]# cat pull_k8s_images.sh
set -o errexit
set -o nounset
set -o pipefail
##这里定义版本,按照kubeadm config images pull 获取到的版本填写对应的版本号
KUBE_VERSION=v1.21.2
KUBE_PAUSE_VERSION=3.4.1
ETCD_VERSION=3.4.13-0
DNS_VERSION=1.8.0
##这是原始仓库名,最后需要改名成这个
GCR_URL=k8s.gcr.io
##这里就是写你要使用的仓库
DOCKERHUB_URL=k8smx
##这里是镜像列表,新版本要把coredns改成coredns/coredns
images=(
kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns/coredns:${DNS_VERSION}
)
##这里是拉取和改名的循环语句
for imageName in ${images[@]} ; do
docker pull $DOCKERHUB_URL/$imageName
docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
docker rmi $DOCKERHUB_URL/$imageName
done
执行脚本就可以下载对应的镜像并给镜像改成对应的名称
bash pull_k8s_images.sh
这里我们提示我们仓库coredns镜像下载失败
我们可以仓库搜索关键字来寻找我们所需对应的版本image
docker pull coredns/coredns:1.8.0
给镜像改名,因为我们需要的镜像信息是k8s.gcr.io/coredns/coredns:v1.8.0
docker tag coredns/coredns:1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
在master 节点上执行初始化
最总结果记录这些信息
根据最总结果的提示执行相关命令
查看相关节点的pod 信息 (pending 是正常的 正在启动搭建pod 最后会变成running 状态)
kubectl get pod -n kube-system
查看node 节点列表信息当前状态是NotReady
节点列表中状态为NotReady,是因为You should now deploy a pod network to the cluster,也就是需要在集群中部署一个pod network,上面的运行结果里写到:
登录到https://kubernetes.io/docs/concepts/cluster-administration/addons/ 选择flannel 网络
在flannel 中的目录下进入documentation 目录选择kube-flannel.yml点击raw 会获取到下载flannel.yml 文件的路径 (如果跳转过去没有信息显示没有关系复制http 的路径就可以了)
https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
使用wget 下载flannel文件 失败原因是我们虚机无法解析到这个域名ip 。
wget url --no-check-certificate https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
我需要知道这个raw.githubusercontent.com 对应的ip 地址
搜素nslookup 使用工具查找
添加域名解析
再次wget 下载 wget url --no-check-certificate https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
加载文件
kubectl apply -f kube-flannel.yml
在检查node 状态已经是ready 状态了
Node 节点的部署
Node1 执行kubeadm join 192.168.0.50:6443 --token mp4ghu.k3wx612pnxtj27ys \
> --discovery-token-ca-cert-hash sha256:cbf3766f4563a35ebc4c0e85e2629abd7b09615462cc2164932365512cf2c56e (之前初始化成功狗有此命令)
Node2 同上
在master 检查新加入的node 节点
kubectl get nodes
部署参照了“https://blog.csdn.net/weixin_43168190/article/details/107227550?spm=1001.2014.3001.5501”
目前node1 与node2 节点显示状态时NotReady 很明显有问题。
检查pod 信息发现flannel pod 节点异常
kubectl describe pod kube-flannel-ds-5rdhb -n kube-system
登录报错的node 节点查询log
发现一直报网络的问题 还有提示我们下载k8s.gcr.io/pause:3.4.1失败 。
针对此问题我将环境中master 下载镜像脚本cp 过来将下载了所有的镜像。
正对network 问题,我将master 上的flanner 的image 保存下来另cp 到node节点上,在node 上重新加载。
[root@master ~]# docker save -o flannel.tar quay.io/coreos/flannel:v0.14.0
[root@master ~]# scp -r flannel.tar 192.168.0.52:/root/
flannel.tar 100% 66MB 99.6MB/s 00:00
[root@master ~]# scp -r flannel.tar 192.168.0.51:/root/
flannel.tar 100% 66MB 99.6MB/s 00:00
在node 节点上执行docker load -i flannel.tar
检查pod 信息,flannel 还是异常的
手动删除有问题的pod ,系统会自己重新在拉一个pod
kubectl delete pod kube-flannel-ds-p2ktn -n kube-system
查看pod 返现问题已经被恢复 ,另一个node的同理。
检查node 状态都是ready 的
验证
下载nginx 的镜像
docker pull nginx
创建一个pod
kubectl create deployment nginx --image=nginx
将端口映射出去
kubectl expose deployment nginx --port=80 --type=NodePort
查询
kubectl get pods,svc
Pod 已经被运行在node2 节点上了,访问node2 的ip+端口31830 可以访问nginx 界面