在VMware环境使用kubeadm快速部署k8s集群实践

时间:2024-03-31 10:30:50

规划好3台主机:

ip地址                    主机名            角色

192.168.193.101   k8s-master      master
192.168.193.102   k8s-node-1       worker
192.168.193.103   k8s-node-2       worker

1、分别修改主机名、IP地址和hosts文件,后期可以通过脚本或自动化安装实现。
hostnamectl set-hostname k8s-master
hostname k8s-master
vim /etc/sysconfig/network-scripts/ifcfg-ens33
 
hostnamectl set-hostname k8s-node-1
hostname k8s-node-1
vim /etc/sysconfig/network-scripts/ifcfg-ens33
  
hostnamectl set-hostname k8s-node-2
hostname k8s-node-2
vim /etc/sysconfig/network-scripts/ifcfg-ens33

改/etc/hosts文件
三台机都要做:
192.168.193.101   k8s-master
192.168.193.102   k8s-node-1
192.168.193.103   k8s-node-2

2、基础环境准备:(三台机都要做)
关闭防火墙、关闭selinux,关闭swap。在模板机阶段已经做好,可以省略。
通过xshell多会话命令行执行
swapoff -a 临时关闭
修改 /etc/fstab 文件,注释掉 SWAP 的自动挂载,永久关闭
# UUID=2d1e946c-f45d-4516-86cf-946bde9bdcd8 swap                    swap    defaults        0 0
使用free -m确认swap已经关闭。 
(可选)swappiness参数调整,修改/etc/sysctl.d/k8s.conf添加下面一行:
vm.swappiness=0
使修改生效
sysctl -p /etc/sysctl.d/k8s.conf

3、docker-ce和k8s的阿里云yum源配置:(三台机都要做,企业环境使用搭建好并且定时任务同步好阿里云yum仓库的内部yum源)
3.1、配置阿里云docker-ce
通过xshell多会话命令行执行
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
sudo yum makecache fast
3.2、配置阿里云的k8s
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

3.3、安装Docker-ce并启动:
通过xshell多会话命令行执行
yum install -y docker-ce ; systemctl start docker ; systemctl enable docker
3.4、安装k8s并启动:通过xshell多会话命令行执行,三台机都要安装
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

4、设置k8s相关系统内核参数:(3台机子都要做)
cat << EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridege-nf-call-iptables = 1
net.bridge.bridege-nf-call-ip6tables = 1
EOF
sysctl -p
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

5、master上做初始化kubeadmin生成node token:

方法1:先使用kubeadm version先确定好版本号(推荐)
kubeadm init --apiserver-advertise-address=192.168.193.101 --image-repository registry.aliyuncs.com/google_containers --ignore-preflight-errors=all  --kubernetes-version v1.16.3 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

方法2:这一步在最新的安装方法中可以不用(该方法较费时间,步骤较多,而且一定要确认好版本号,否制会报错,仅供参考)导入所需要的镜像:(一定要下载跟kubeadmin相同版本的镜像才行,用kubeadmin version查看版本号后再下载,再打tag,如果版本号不对,在做kubeadm init的时候老是会卡在Initial timeout of 40s passed,使用journalctl -xeu kubelet查询时老是会提示node "k8s-master" not found,即使是已经改了/etc/hosts和--apiserver-advertise-address)
为什么要导入镜像呢?因为kubeadmin会去谷歌的镜像源上面下载,大家都懂得!所以我下载下来,使用的时候直接导入就好了。

所需要的镜像:通过xshell多会话命令行执行
k8s.gcr.io/kube-apiserver:v1.13.3
k8s.gcr.io/kube-controller-manager:v1.13.3
k8s.gcr.io/kube-scheduler:v1.13.3
k8s.gcr.io/kube-proxy:v1.13.3
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.6
k8s.gcr.io/pause:3.1

docker load < kube-apiserver.tar
docker load < kube-controller-manager.tar
docker load < kube-scheduler.tar
docker load < kube-proxy.tar
docker load < etcd.tar
docker load < coredns.tar
docker load < pause.tar
docker images
这里所用到的镜像,我会全部打包网盘上,需要的可以去下载。导入方式相同,只需要全部导入即可!
把包解压出来后拉到3台机子上面,也可以通过docker search kube-apiserver  找到相应的镜像,再自己pull下来打tag。
docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0
docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.16.0
docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0 
docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0
docker tag mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0   k8s.gcr.io/kube-apiserver:v1.16.0
docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.16.0  k8s.gcr.io/kube-proxy:v1.16.0
docker tag mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0  k8s.gcr.io/kube-scheduler:v1.16.0
docker tag mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0  k8s.gcr.io/kube-controller-manager:v1.16.0
5.1master初始化遇到的问题:
5.1.1、使用kubeadm init 初始化环境,--kubernetes-version指定版本(这里使用最新版v1.16做测试),-pod-network-cidr指定虚拟网络的网段,可以随便指定任何网段!
kubeadm init --apiserver-advertise-address=192.168.193.102 --kubernetes-version=v1.16.0  --pod-network-cidr=10.244.0.0/16
因为出现初始化出错[kubelet-check] Initial timeout of 40s passed.因此不能直接使用该方法直接初始化

在VMware环境使用kubeadm快速部署k8s集群实践
journalctl -xeu kubelet
kubelet.go:2267] node "k8s-master" not found 老是出现

在VMware环境使用kubeadm快速部署k8s集群实践
找了多个解决方法都没用,包括改kubeadm.yaml,改advertise-address,最后用了对的版本才通过。

5.1.2、(此问题在worker节点加入集群时也会碰到,因此在第4步时就要3台全做)[preflight] Some fatal errors occurred:/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
解决方案:
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

6、得到Your Kubernetes control-plane has initialized successfully!后,说明初始化成功。

在VMware环境使用kubeadm快速部署k8s集群实践
下一步增加kubectl权限访问:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

7、在2个节点上分别运行一下加入到集群当中:第7和8步顺序可以相反。
kubeadm join 192.168.193.101:6443 --token t8c9hu.6e5t77mluih69bya \
    --discovery-token-ca-cert-hash sha256:1f808842249d68ff7e8bc56e12ba7169997330cf3f646754e640b1183f8e2acc 
kubectl get nodes  状态为notready,因为还没安装网络flanel。

8、给集群添加网络:(只要在master上面做)第7和8步顺序可以相反。
方法1:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
方法2:wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f  kube-flannel.yml
不需要重新再添加节点进来,但需要再稍等一定的时间再去查询状态,因为机子的性能不同,时间可能不同。

8.1、给集群添加网络时遇到的问题:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml  老是提示ssl连接错误
解决方法:
yum install openssl-devel -y

9、查看集群健康状态
kubectl get cs                                    1.15之前的版本
kubectl get cs -o yaml                       1.15之后的版本
kubectl get ns                                   查看所有名称空间
kubectl get nodes                             查看所有节点信息
kubectl get pods                               查看所有pods信息

kubectl get pod --all-namespaces

注:一般集群固定好IP后就不再修改,如果真的需要修改IP,可以根据以下步骤(此操作也适用于节点挂掉连不上,或者集群挂掉,连master都挂掉)
1、修改IP地址。
2、先将node节点踢出集群,kubectl delete nodes  XXX
3、在node上初始化kubectl reset,这一步会删除原有的容器和配置文件,如果是master都挂掉了,需要把master也reset再做init,同样是会删除原有的容器和配置文件。(前提要做好重要的数据备份出来,一般容器都做持久化本地或网络存储)
4、再重新节点执行加入集群的操作。