利用kubeadm搭建了Kubernetes v1.18.0,这里做一个记录,最好不要照着这个博客搭建你们的生产环境,对于kubernetes的介绍这里就不再啰嗦了
初始化环境
环境介绍
这里利用自己笔记本上的VMware,使用了4个节点1个master节点,3个node节点,这里会首先初始化一个主机,搭建基础环境,完成后做快照,而后克隆该快照并修改IP地址主机名,减少了我们的工作量,以下是大概的规划表格
序号 | IP地址 | 主机名 | 操作系统 | 硬件配置 | 节点类型 |
---|---|---|---|---|---|
1 | 192.168.132.61 | kubernetes01 | CentOS7.7 | 2核2G | Master |
2 | 192.168.132.62 | kubernetes02 | CentOS7.7 | 2核2G | Node |
3 | 192.168.132.63 | kubernetes03 | CentOS7.7 | 2核2G | Node |
4 | 192.168.132.64 | kubernetes04 | CentOS7.7 | 2核2G | Node |
修改主机名
hostnamectl set-hostname kubernetes01
hosts文件
192.168.132.61 kubernetes01
192.168.132.62 kubernetes02
192.168.132.63 kubernetes03
192.168.132.64 kubernetes04
关闭selinux,firewalld
systemctl stop firewalld
systemctl disable firewalld
sed -ri.bak 's,SELINUX=(enforcing|permissive),SELINUX=disabled,' /etc/selinux/config
getenforce # 获取当前selinux状态,Disabled为关闭,注意修改了配置文件需要重启才生效
关闭swap
swapoff -a
sed -ri.bak 's,^(UUID=[a-z0-9\-]+ swap.*),#\1,' /etc/fstab
时间同步
Centos7中同步时间使用的是chronyd服务,比也是利用的ntp,比传统的ntp效果更好,其配置文件是/etc/chrony.conf
可以修改配置文件中的server
指定时间服务器地址,只要保证该服务正常运行就可以了
准备yum仓库配置
base源:
cd /etc/yum.repos.d
mkdir repos_bak
mv *.repo repos_bak #将系统的源配置文件备份 使用我们自己的
vim base.repo
[base]
name=base
baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0
epel源
vim epel.repo
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0
docker源
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
extras源:docker依赖的某些包会在这个源中
vim extras.repo
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
安装docker
yum install docker-ce
mkdir -p /etc/systemd/system/docker.service.d
安装过程有什么问题可以参考之前的博客 CentOS安装docker
配置docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
systemctl daemon-reload
systemctl start docker
systemctl enable docker
以上,registry-mirrors
是将docker默认拉取的仓库修改为国内源,以提高拖取镜像的速度
配置内核参数
cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sysctl --system
加载ip_vs内核模块
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
安装kubernetes相关软件包
yum install kubelet kubeadm kubectl ipvsadm
echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' >> /etc/sysconfig/kubelet
systemctl enable kubelet
构建flannel镜像
由于我这里网络的问题后续安装集群时用到的flannel的镜像拉不下来,这里自己先制作一个flannel的镜像
mkdir -pv flannel/dist
cd flannel
wget https://github.com/coreos/flannel/raw/master/Dockerfile.amd64 -O Dockerfile
cd dist
wget https://github.com/coreos/flannel/raw/master/dist/mk-docker-opts.sh
wget https://github.com/coreos/flannel/releases/download/v0.12.0/flanneld-amd64
cd ..
从github下载flanneld-amd64可能会特别慢,可以到 https://dl.smartyhero.com 下载
镜像是基于alpine镜像制作的,由于alpine镜像中的apk
命令使用的默认软件仓库我的网络访问特别慢,这里稍微修改一下Dockerfile,将镜像源改为阿里云,结果如下
FROM alpine
LABEL maintainer="Tom Denham <tom@tigera.io>"
ENV FLANNEL_ARCH=amd64
RUN echo 'http://mirrors.aliyun.com/alpine/v3.11/main' > /etc/apk/repositories \
&& echo 'http://mirrors.aliyun.com/alpine/v3.11/community' >> /etc/apk/repositories \
&& apk add --no-cache iproute2 net-tools ca-certificates iptables strongswan && update-ca-certificates \
&& apk add wireguard-tools --no-cache --repository http://mirrors.aliyun.com/alpine/edge/community
COPY dist/flanneld-$FLANNEL_ARCH /opt/bin/flanneld
COPY dist/mk-docker-opts.sh /opt/bin/
ENTRYPOINT ["/opt/bin/flanneld"]
制作镜像
docker image build -t quay.io/coreos/flannel:v0.12.0-amd64 .
做快照
到这里基础环境就做的差不多了,可以关机做一个快照了,而后克隆三个虚拟机出来,这里提供一种VMware使用命令克隆的方式,首先需要打开cmd而后将目录切换到VMware的安装目录下
vmrun.exe -T ws clone "E:\vms\kubernetes01\kubernetes01.vmx" "E:\vms\kubernetes02\kubernetes02.vmx" full -snapshot=init -cloneName=kubernetes02
克隆完成后VMware workstation中是没有的,需要使用文件 --> 扫描虚拟机
然后选择你虚拟机的父目录,可以将克隆的虚拟机加载到workstation的列表中
克隆完成后,启动所有的虚拟机,而后修改IP地址,主机名,接下来就可以正常安装集群了
安装集群
初始化集群(主节点)
kubeadm init --kubernetes-version=v1.18.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --image-repository gcr.azk8s.cn/google_containers --apiserver-advertise-address=192.168.132.61
mkdir -p $HOME/.kube # 以下这三条命令是为kubectl命令提供一个相当于秘钥文件吧
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
当然在执行kubeadm init
命令的时候很有可能会报错,可以根据提示操作后,重新执行,没有问题后,最后输出的kubeadm join
命令需要记录下来,利用这条命令可以将其他节点加入集群,
早期版本的时候我们安装集群最大的问题就是拉取不到镜像,后期的kubeadm工具提供了指定镜像源的选项--image-repository
让我自己指定一个可以访问到的镜像地址
如果机器上有多个网卡可以使用 --apiserver-advertise-address
来确定api-server监听在哪个地址上
配置flannel
刚才我们已经构建好了flannel镜像,直接利用官方提供好的yaml文件安装就可以了
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kube-proxy使用ipvs
有可能我们安装后发现,虽然我们加载了ipvs相关的内核模块但是还是使用iptables来实现的service网络,可以利用下面的方法将其改为使用ipvs
kubectl edit configmap kube-proxy -n kube-system
这里会打开一个vi编辑器需要修改mode的值为ipvs,大概位置如下
kind: KubeProxyConfiguration
metricsBindAddress: ""
mode: "ipvs" # 这里本身可能是"",需要修改为"ipvs"
nodePortAddresses: null
oomScoreAdj: null
portRange: ""
showHiddenMetricsForVersion: ""
udpIdleTimeout: 0s
删除原有的kube-proxy相关的pod,他会使用新的配置文件重新启动kube-proxy
ipvsadm -C # 先清理ipvs规则
kubectl get pods -n kube-system # 根据这里获取到的kube-proxy名称进行下面的删除操作
kubectl delete pod kube-proxy-xxx -n kube-system
可以使用ipvsadm -Ln
命令验证,也可以使用查看kube-proxy的日志确认,可以看到开头会有 server_others.go:259] Using ipvs Proxier.
这样的输出,表明我们已经使用了ipvs
Node节点配置
这里需要使用你自己init的时候得到的命令,用我这个肯定不行的
kubeadm join 192.168.132.61:6443 --token 6nk6ze.ub4oqstmlwf8issz \
--discovery-token-ca-cert-hash sha256:366aef98300b358923f86617f4cb1d74ffba393b9d24378a4e2ab5aeee31914a
接下来在Master节点就可以看到已经加入到集群的节点了
kubectl get nodes
如果想要重新安装集群,可以使用kubeadm reset
命令重置集群
最后,我自己的集群有个问题,通过service在宿主机上访问,速度会特别慢,在pod中访问时没有问题的,不知道大家有没有遇到的,如果您有幸看到这篇文章可以在下方进行交流,后期如果自己换了性能更好的电脑,可能会出一套利用二进制方式搭建集群的教程
文章评论(0)