赞
踩
mac新发布了m1芯片,但因为其架构的更换,导致很多软件和环境的安装成了问题。因为想学习k8s集群部署,但是搭建k8s集群至少要两台2核4G的服务器,如果选择云服务的话成本较高,所以选择了使用虚拟机进行搭建。
k8s:官网地址
为什么选择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 |
---|---|
master | 172.16.59.12 |
node | 172.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
每台虚拟机都设置
# 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。
每台虚拟机都设置
# 安装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主机【内网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
部署应用都应该在主节点(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,可以修改指定
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。