MacOS M1 虚拟机VMware部署CentOS7搭建k8s集群
一、环境初始化
1.检查操作系统版本
# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
# 查看系统版本
cat /etc/centos-release
# 查看内核版本
uname -sr
可以批量发送,后面就不贴图了
2.主机名解析
为了方便调用,配置一下主机名解析,企业中推荐用内部DNS服务器
# 增加hosts解析
cat >>/etc/hosts <<EOF
192.168.3.210 master
192.168.3.211 node1
192.168.3.212 node2
EOF
可以ping主机名测试一下
3.时间同步
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。
企业中建议配置内部的时间同步服务器
# 启动chronyd服务
systemctl start chronyd
# 设置chronyd服务开机自启
systemctl enable chronyd
# chronyd服务启动稍等几秒钟,就可以使用date命令验证时间了
date
可以看到时间一致了
4.禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则。注意:生产环境关掉firewalld要慎重
# 1 关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
# 2 关闭iptables服务
systemctl stop iptables
systemctl disable iptables
当前这个系统没有iptables,所以显示无此服务
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,会导致待会重启之后无法正常登录。
6.禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用。
启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备。
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明。
# 临时关闭,主机重启后k8s无法自动重启,需要重新关闭swap
swapoff -a
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
可以看到这个地方被注释掉了,也就永久关闭了。
cat /etc/fstab
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
效果如下
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
# 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
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
执行结果
三、部署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
结果
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
至此,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服务
执行结果
可以看到nginx-port 80:30223;可以访问看看。三个ip都可以的
五、部署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,然后回车,保存并退出。
kubectl get svc -A |grep kubernetes-dashboard
可以看到kubernetes-dashboard port 443:32141;可以访问看看。三个ip都可以的。
浏览器访问:https://集群任意IP:端口
https://192.168.3.210:32141/ 注意是https协议。 如果是http协议会出现以下情况:
使用https协议打开出现以下页面:(chrome浏览器)
键盘输入:thisisunsafe,页面即可显示登录页面:
需要创建一个账号
#创建访问账号,准备一个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}}"
输入token登录成功:
附录
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