使用MacOS M1(ARM)芯片系统搭建CentOS虚拟机,并基于kubeadm部署搭建k8s集群

引言

mac新发布了m1芯片,但因为其架构的更换,导致很多软件和环境的安装成了问题。因为想学习k8s集群部署,但是搭建k8s集群至少要两台2核4G的服务器,如果选择云服务的话成本较高,所以选择了使用虚拟机进行搭建。
k8s:官网地址

虚拟机VMware Fusion

为什么选择VMware Fusion? 因为没得选。大多数虚拟机都不支持M1(ARM)架构…
下载地址: VMware Fusion for M1
参考网址:mac M1(ARM)安装
按照上面大佬提供的镜像还有安装过程,能顺利的把CentOS7能安装上。
这个实测好用!这篇文章讲的很详细,镜像也是好使的。网上的镜像水太深了,且太费精力了。市面上能支持M1(ARM架构)的CentOS7真的太少了。
如果操作过程中发现 ping不通 www.baidu.com
可以参考这篇文章:mac M1配置VMware Fusion虚拟机网络配置

环境准备

至少2台虚拟机,一台master,一台node
注意:两台虚拟机之间网络互通,同时可以访问外网,禁止swap分区。
硬件配置:2核4G,硬盘40G

名称IP
master172.16.59.12
node172.16.59.13

在这里插入图片描述
在这里插入图片描述
master和node都要执行:

# 禁止swap分区命令
swapoff -a
# 永久关闭swap分区命令
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 关闭防火墙
systemctl stop firewalld   #暂时关闭
systemctl disable firewalld   #永久关闭
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭  
# setenforce 0 # 临时关闭

master 执行:

# 根据规划设置主机名
hostnamectl set-hostname k8smaster

node 执行:

# 根据规划设置主机名
hostnamectl set-hostname k8snode1

在master添加hosts:

# 自己的master和node的ip地址 
# ip addr 查看本机ip地址
cat >> /etc/hosts << EOF
172.16.59.12 k8smaster
172.16.59.13 k8snode1
EOF

将桥接的IPv4流量传递到iptables的链 (每台虚拟机都设置)

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system   
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com

安装Docker

每台虚拟机都设置

# 1.先安装yml
yum install -y yum-utils device-mapper-persistent-data lvm2
# 2.设置阿里云镜像
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 3.查看可安装的docker版本
yum list docker-ce --showduplicates | sort -r

#4. 安装docker
yum -y install docker-ce-20.10.10-3.el7

#5. 查看docker版本
docker -v

#配置开机自启动
systemctl enable docker.service

#6. 启动docker
systemctl start docker

#7. 查看docker 启动状态
systemctl status docker

配置阿里云镜像加速
进入阿里云官网,找到容器镜像服务下的镜像加速器:阿里云镜像加速器

在这里插入图片描述
地址换成自己的地址,依次执行官方的这四条命令

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

配置镜像源

每台虚拟机都设置

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

注意:网上配置k8s的镜像源都是 https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64;一定要记住咱们是ARM架构,不是X86。
镜像源:https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
配置完后刷新yum源:

sudo yum clean all

# 如果不刷新yum源安装kube三兄弟会报错 没有可用软件包
sudo yum install -y kubelet kubeadm kubectl
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.bfsu.edu.cn
 * extras: mirrors.bfsu.edu.cn
 * updates: mirrors.bfsu.edu.cn
没有可用软件包 kubelet。
没有可用软件包 kubeadm。
没有可用软件包 kubectl。

安装Kube 三兄弟

每台虚拟机都设置

# 安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

# 设置开机启动
systemctl enable kubelet

# 检查版本
kubelet --version
kubeadm version
kubectl version

如果下载失败,大概率是镜像配置错误。查看配置k8s镜像源是否是aarch,ARM架构不支持x86镜像源。
注:修改yum源后记得刷新yum源

sudo yum clean all

Master 节点初始化

# 只修改两个地方(master主机【内网IP】,k8s软件版本)
kubeadm init \
--apiserver-advertise-address=172.16.59.12 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

当出现下面的情况,表示Kubernetes的镜像已经安装成功

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.16.59.12:6443 --token 415br2.xzfaxx0derdc3jvy \
    --discovery-token-ca-cert-hash sha256:c886eb4d796b2f62dd1ad0dd3a3e84ec1480e9adbfbcddc2760b0475d91b7aae 

使用kubectl工具 【master节点操作】

# 可能不一样,请按照初始化日志提示执行
# To start using your cluster, you need to run the following as a regular user:
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 nodes

加入Kubernetes Node【node节点操作】

#根据初始化日志提示执行。每个人的都不一样!!!需要复制自己生成的
kubeadm join 172.16.59.12:6443 --token 415br2.xzfaxx0derdc3jvy \
    --discovery-token-ca-cert-hash sha256:c886eb4d796b2f62dd1ad0dd3a3e84ec1480e9adbfbcddc2760b0475d91b7aae

kubeadm init 报错 [ERROR CRI]: container runtime is not running
我参考的是这个帖子,并且解决了这个问题:可能解决方案之一
kubeadm init 报错:[kubelet-check] Initial timeout of 40s passed.
解决方法:
1.卸载k8s

yum remove -y kubelet kubeadm kubectl
 
kubeadm reset -f
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd

2.重新初始化

# 安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
systemctl enable kubelet
# 服务端节点重置并重新初始化:
kubeadm reset
# 重新初始化
kubeadm init \
--apiserver-advertise-address=172.16.59.12 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

注:kubeadm reset 是解决 出现 [kubelet-check] Initial timeout of 40s passed的核心方法。网上还有别的其他解决方案:k8s Initial timeout of 40s passed. 我没试过,如果使用kubeadm reset 解决不了的话,可以尝试下这种方式。
查看节点

kubectl get nodes
#状态都是NotReady,需要配置网络插件

#安装网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 查看状态 【kube-system是k8s中的最小单元】
kubectl get pods -n kube-system
# 运行完成后查看状态
kubectl get nodes

已经变成Ready状态

[root@k8smaster ~]# kubectl get pods -n kube-system
NAME                                READY   STATUS    RESTARTS   AGE
coredns-7ff77c879f-dc24d            1/1     Running   0          98m
coredns-7ff77c879f-dr586            1/1     Running   0          98m
etcd-k8smaster                      1/1     Running   0          98m
kube-apiserver-k8smaster            1/1     Running   0          98m
kube-controller-manager-k8smaster   1/1     Running   0          98m
kube-proxy-w7d2m                    1/1     Running   0          98m
kube-proxy-zs2fc                    1/1     Running   0          72m
kube-scheduler-k8smaster            1/1     Running   0          98m
[root@k8smaster ~]# kubectl get nodes
NAME        STATUS   ROLES    AGE    VERSION
k8smaster   Ready    master   103m   v1.18.0
k8snode1    Ready    <none>   77m    v1.18.0

如果按照以上方式都执行完,Master还是NoReady状态,请耐心等待一会。
ps:我当时凌晨1点搞到这一步后,发现Master还是NoReady状态。因为扛不住了想着先睡觉,明天再看看是什么问题。然后早上起来后重新执行了下 kubectl get nodes 命令,发现所有节点的状态都变成Ready了。我也没太搞懂是怎么问题哈哈哈。

# 如果上述操作完成后,还存在某个节点处于NotReady状态,可以在Master将该节点删除
kubectl delete node k8snode1
# 重新生成 kubeadm join 命令
[root@k8smaster ~]# kubeadm token create --print-join-command
W0905 07:33:36.081183    4877 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join 172.16.59.12:6443 --token uzw0ln.kz5poi1smz53oi8g     --discovery-token-ca-cert-hash sha256:c886eb4d796b2f62dd1ad0dd3a3e84ec1480e9adbfbcddc2760b0475d91b7aae


# 然后到k8snode1节点进行重置
kubeadm reset
# 重置完成后加入
kubeadm join 172.16.59.12:6443 --token uzw0ln.kz5poi1smz53oi8g     --discovery-token-ca-cert-hash sha256:c886eb4d796b2f62dd1ad0dd3a3e84ec1480e9adbfbcddc2760b0475d91b7aae

简单部署第一个k8s应用验证-Nginx

部署应用都应该在主节点(Master)

# 创建deployment(Pod控制器的一种)
kubectl create deployment my-nginx --image=nginx:1.23.0

# 查看deployment和pod
kubectl get deployment,pod,svc

# 刚开始需要拉取镜像,需要等待一段时间 会发现pod状态是 ContainerCreating
[root@k8smaster ~]# kubectl get deployment,pod,svc
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-nginx   0/1     1            0           22s

NAME                            READY   STATUS              RESTARTS   AGE
pod/my-nginx-5f9bb455d4-z9qhq   0/1     ContainerCreating   0          22s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   156m

# 大约30s后再次执行 kubectl get deployment,pod,svc 会发现pod状态是 Running
[root@k8smaster ~]# kubectl get deployment,pod,svc
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-nginx   1/1     1            1           3m55s

NAME                            READY   STATUS    RESTARTS   AGE
pod/my-nginx-5f9bb455d4-z9qhq   1/1     Running   0          3m55s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   159m
# 暴露80端口,创建service
kubectl expose deployment my-nginx --port=80 --type=NodePort

# 查看端口映射
kubectl get pod,svc

[root@k8smaster ~]# kubectl expose deployment my-nginx --port=80 --type=NodePort
service/my-nginx exposed
[root@k8smaster ~]# kubectl get pod,svc
NAME                            READY   STATUS    RESTARTS   AGE
pod/my-nginx-5f9bb455d4-z9qhq   1/1     Running   0          9m54s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        165m
service/my-nginx     NodePort    10.102.236.28   <none>        80:30319/TCP   8s

在浏览器访问, 工作节点开放端口30319,访问工作节点ip:31512

# master、node节点访问这个 开放的端口都可以
http://172.16.59.12:30319
http://172.16.59.13:30319

在这里插入图片描述
注:Kubeadm部署,暴露端口对外服务,会随机选端口,默认范围是30000~32767,可以修改指定

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值