mac搭建k8s-docker方式

978 阅读6分钟

MacOS M1 虚拟机VMware部署CentOS7搭建k8s集群

一、环境初始化

1.检查操作系统版本

# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
# 查看系统版本
cat /etc/centos-release
# 查看内核版本
uname -sr

可以批量发送,后面就不贴图了

image.png

image.png

2.主机名解析

为了方便调用,配置一下主机名解析,企业中推荐用内部DNS服务器

# 增加hosts解析
cat >>/etc/hosts <<EOF
192.168.3.210 master
192.168.3.211 node1
192.168.3.212 node2
EOF

可以ping主机名测试一下

image.png

3.时间同步

kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。

企业中建议配置内部的时间同步服务器

# 启动chronyd服务
systemctl start chronyd
# 设置chronyd服务开机自启
systemctl enable chronyd
# chronyd服务启动稍等几秒钟,就可以使用date命令验证时间了
date

可以看到时间一致了

image.png

4.禁用iptables和firewalld服务

kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则。注意:生产环境关掉firewalld要慎重

# 1 关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
# 2 关闭iptables服务
systemctl stop iptables
systemctl disable iptables

当前这个系统没有iptables,所以显示无此服务

image.png

5.禁用selinux

selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

# 将 SELinux 设置为 permissive 模式,即从强制模式修改为宽容模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

通过查看可以看到确实config已经被修改

# 查看/etc/selinux/config
cat /etc/selinux/config

这里注意,如果把SELINUX改成SELINUX=disabled,会导致待会重启之后无法正常登录。

image.png

6.禁用swap分区

swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用。

启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备。

但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明。

# 临时关闭,主机重启后k8s无法自动重启,需要重新关闭swap
swapoff -a 
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

可以看到这个地方被注释掉了,也就永久关闭了。

cat /etc/fstab

image.png

7.修改linux的内核参数

# 修改linux的内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
cat >>/etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 重新加载配置
sysctl -p
# 加载网桥过滤模块
modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter

效果如下

image.png

8.配置ipvs功能

在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的

两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

因为默认的yum仓库是国外的,下载有问题,所以接下来替换yum源。

更新一下Centos altarch 7 配置

wget http://mirrors.aliyun.com/repo/Centos-altarch-7.repo -O /etc/yum.repos.d/CentOS-Base.repo

image.png

# 1 安装ipset和ipvsadm
yum install ipset ipvsadm -y
# 2 添加需要加载的模块
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
# 3 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack

运行ok

image.png

9.重启服务器

上面步骤完成之后,需要重新启动linux系统

reboot

二、部署Docker环境

安装docker

# 1 切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
 
# 2 查看当前镜像源中支持的docker版本
yum list docker-ce --showduplicates
 
# 3 安装特定版本的docker-ce
# 必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
 
# 4 添加一个配置文件
# Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
mkdir /etc/docker
cat >>/etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://kn0t2bca.mirror.aliyuncs.com"
    ]
}
EOF
 
# 5 启动docker
systemctl restart docker
systemctl enable docker
 
# 6 检查docker状态和版本
docker version

执行结果

image.png ​​​​​​​

三、部署k8s集群

1.安装kubernetes组件

注意m1芯片是aarch64

# 由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源
# 编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置 
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
# 安装kubeadm、kubelet和kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
 
# 配置kubelet的cgroup
# 删除原始的 /etc/sysconfig/kubelet
rm -f /etc/sysconfig/kubelet
# 编辑/etc/sysconfig/kubelet,添加下面的配置
cat >>/etc/sysconfig/kubelet <<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF
 
# 4 设置kubelet开机自启
systemctl enable kubelet

2.准备集群镜像

# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
kubeadm config images list
 
# 下载镜像
# 此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案
images=(
    kube-apiserver:v1.17.4
    kube-controller-manager:v1.17.4
    kube-scheduler:v1.17.4
    kube-proxy:v1.17.4
    pause:3.1
    etcd:3.4.3-0
    coredns:1.6.5
)
 
for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName       k8s.gcr.io/$imageName
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

3.集群初始化

下面开始对集群进行初始化,并将node节点加入到集群中

下面的操作只需要在 master节点上执行即可

关闭广播,只在master执行,注意ip改成自己的master虚拟机ip

# 创建集群
kubeadm init \
    --kubernetes-version=v1.17.4 \
    --pod-network-cidr=10.244.0.0/16 \
    --service-cidr=10.96.0.0/12 \
    --apiserver-advertise-address=192.168.3.210
 
# 创建必要文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
 
#-–apiserver-advertise-address 集群通告地址(master内网) 注意修改为master节点的address
#–-kubernetes-version K8s版本,与上面安装的一致
#–-service-cidr 集群内部虚拟网络,Pod统一访问入口
#-–pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致

执行结果

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 192.168.3.210:6443 --token gvyhx9.oymcqci72bx12my0 \
    --discovery-token-ca-cert-hash sha256:023be851a41b382dbcd53d12e8cbd93dd65096dface95cdc6d22470077f824e0

复制一下刚刚结果里面生成的join指令

下面的操作只需要在 node节点上执行即可

# 将node节点加入集群
kubeadm join 192.168.3.210:6443 --token gvyhx9.oymcqci72bx12my0 \
    --discovery-token-ca-cert-hash sha256:023be851a41b382dbcd53d12e8cbd93dd65096dface95cdc6d22470077f824e0

在master上查看

# 查看集群状态 此时的集群状态为NotReady,这是因为还没有配置网络插件
kubectl get nodes

结果

image.png

4.安装网络插件

kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel

下面操作依旧只在 master节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行

# 获取fannel的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
 
# 修改文件中quay.io仓库为quay-mirror.qiniu.com
# 现在不需要改了
 
# 使用配置文件启动fannel
kubectl apply -f kube-flannel.yml
 
# 稍等片刻,再次查看集群节点的状态
kubectl get nodes

image.png 至此,kubernetes的集群环境搭建完成。

四、 服务部署验证集群情况(用不到nginx可跳过)

接下来在kubernetes集群中部署一个nginx程序,测试下集群是否在正常工作。在master上执行

# 1 部署nginx
kubectl create deployment nginx --image=nginx:1.14-alpine
 
# 2 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
 
# 3 查看服务状态
kubectl get pods,service
 
# 4 最后在电脑上访问下部署的nginx服务

执行结果

image.png

可以看到nginx-port 80:30223;可以访问看看。三个ip都可以的

image.png

五、部署Dashboard可视化界面

kubernetes官方提供的可视化界面:github.com/kubernetes/…

在master上执行

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
#type: ClusterIP 改为 type: NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

按i键:在光标当前位置开始插入文本。 按Esc键回到命令模式。 输入:wq,然后回车,保存并退出。

image.png

kubectl get svc -A |grep kubernetes-dashboard

image.png 可以看到kubernetes-dashboard port 443:32141;可以访问看看。三个ip都可以的。

浏览器访问:https://集群任意IP:端口

https://192.168.3.210:32141/ 注意是https协议。 如果是http协议会出现以下情况:

image.png

使用https协议打开出现以下页面:(chrome浏览器)

image.png

键盘输入:thisisunsafe,页面即可显示登录页面:

image.png

需要创建一个账号

#创建访问账号,准备一个yaml文件; 
vi dashaccount.yaml

按i键:插入以下文本。 按Esc键回到命令模式。 输入:wq,然后回车,保存并退出。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
# 部署
kubectl apply -f dashaccount.yaml
#获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

image.png

输入token登录成功:

image.png

image.png

image.png

附录

k8s常用命令


    # 查看所有节点		
    kubectl get nodes 		
     
    # 查看集群服务器信息
    kubectl get nodes -o wide	
    	
    # 查看kube-system命名空间下的pod
    kubectl get pods -n kube-system
     
    # 部署资源
    kubectl apply -f calico.yaml
     
    # 删除部署
    kubectl delete -f calico.yaml
     
    # 强制删除pod 命名空间为kube-system pod为name为coredns-545d6fc579-s2j64 
    kubectl delete pod coredns-545d6fc579-s2j64 -n kube-system --grace-period=0 --force  
     
    # 查看所有名称空间  namespace简称ns
    kubectl get ns    	
     
    # 创建名称空间						  
    kubectl create ns 名称空间	
     
    # 删除名称空间			
    kubectl delete ns 名称空间		
     
    # 查看默认default名称空间下的应用				
    kubectl get pods			
     
    # 监控查看Pod
    kubectl get pod -w		
     
    # 监控查看Pod				
    watch -n 1 kubectl get pods	 	
     
    # 查看所有应用	
    kubectl get pods -A 		
     
    # 查看该名称空间下的应用				
    kubectl get pods -n 名称空间
     
    # 查看默认名称空间下更详细的应用信息 			
    kubectl get pod -owide     				
     
    # 查看所有pod使用的内存 
    kubectl top pod -A 
     
    # 查看容器描述   默认是default命名空间
    kubectl describe pod myk8snginx  
     
    kubectl describe pod -n ruoyi-cloud ry-cloud-mysql-0
     
    # 查看Pod运行日志
    kubectl logs mynginx			
     
    # 进入容器		
    kubectl exec -it mynginx -- /bin/bash	
    kubectl exec -it redis -- redis-cli

开启自动补全

当我们在使用kubectl命令时,如果不能用tab补全,将会非常麻烦,得把命令一个一个敲出来但是配置自动补全之后就非常方便了

安装命令

安装bash-completion

yum install bash-completion -y 

执行命令

执行bash_completion

source /usr/share/bash-completion/bash_completion 

重新加载

重新加载kubectl completion

source <(kubectl completion bash) 

永久生效

配置永久生效

echo "source <(kubectl completion bash)" >> ~/.bashrc