k8s集群的搭建有二进制方式和kubeadm方式,kubeadm方式搭建比较简单,但二进制方式有助于帮助理解集群搭建过程中更加细节的部分,本文采用kubeadm方式,有兴趣和能力的同学看完本篇后可以去了解二进制方式。
说明:docker+k8s集群搭建是我学校的一个课程实验,我也是在网上找教程边学边实践,找了很多教程也踩了不少坑,这里是对整个实验能够顺利集群的一个整理,在这里感谢网上写教程的其他博主。
两台及以上centos7系统的虚拟机(ip地址通过ifconfig查看或参考下面的虚拟机联网)
1.master机:192.168.56.200
node机:192.168.56.201 192.168.56.202
2.每台虚拟机配置2核2G以上(若1核后面可能会报错)
3.可以访问外网
4.每台机器都需要禁用swap分区,否则无法正常使用kubelet
配置静态ip(自己设置ip)
参考:https://blog.csdn.net/weixin_44806034/article/details/104996343
所有虚拟机分别执行相应命令
[root@localhost ~]# hostname set-hostname k8smaster
[root@localhost ~]# hostname set-hostname k8snode1
[root@localhost ~]# hostname set-hostname k8snode2
所有机器都要执行
$ systemctl stop firewalld #临时关闭
$ systemctl disable firewalld #永久关闭
避免集群搭建出问题,所有机器都要执行
$ sed -i 's/enforcing/disabled/' /etc/selinux/config #永久
$ setenforce 0 #临时
$ swapoff -a #临时
$ sed -i.bak '/swap/s/^/#/' /etc/fstab #永久
这一步仅在master机执行
$ cat >> /etc/hosts << EOF
192.168.56.200 master
192.168.56.201 node1
192.168.56.202 node2
EOF
永久修改,所有机器执行
$ 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
$ yum install -y yum-utils device-mapper-persistent-data lvm2
没有wget的安装wget
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
安装指定版本的docker
$ yum -y install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io
启动docker
$ systemctl start docker # 启动docker
$ systemctl enable docker # 设为开机启动
$ docker --version # 查看版本
由于Docker Hub的服务器在国外,下载镜像会比较慢,可以配置镜像加速器。主要的加速器有:Docker官方提供的中国registry mirror、阿里云加速器、DaoCloud 加速器,在此使用阿里云配置。
(1)登录阿里云模块
登录地址:https://cr.console.aliyun.com/cn-beijing/instances/mirrors
(2)配置并重启
$ cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://y4wniq8i.mirror.aliyuncs.com"]
}
EOF
$ systemctl daemon-reload
$ systemctl restart docker #重启docker
截图
(3)添加kubernetes源
直连官网可能会拉取失败
$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
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
通过以上操作docker已经安装好了,现在进行检验
$ docker –version # 查看docker版本
$ docker run hello-world
保证各节点mac和uuid唯一
所有机器斗眼执行
$ cat cat /sys/class/net/ens32/address
$ cat /sys/class/dmi/id/product_uuid
略,在准备阶段已经操作了
这一步可以先不用管,跳过该步,但是可以了解一下docker和k8s的Cgroup驱动,如果后面某步有Cgroup相关报错可回来揣摩一下。
点击了解Cgroup驱动
(1)修改 daemon.json
修改daemon.json,新增‘ “exec-opts”: [“native.cgroupdriver=systemd”] ’ |
---|
$ systemctl daemon-reload
$ systemctl restart docker
修改cgroupdriver是为了消除告警:
[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”. Please follow the guide at https://kubernetes.io/docs/setup/cri/
但是可能会报错,如果报错删掉增加的信息,不影响后面操作。
$ yum clean all
$ yum -y makecache
[root@k8smaster ~]# yum list kubelet --showduplicates | sort -r
(1)安装kubelet、kubeadm、kubectl包,安装1.14.2版本
[root@k8smaster ~]# yum install -y kubelet-1.14.2
[root@k8smaster ~]# yum install -y kubeadm-1.14.2
[root@k8smaster ~]# yum install -y kubectl-1.14.2
#安装包说明
#• kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
#• kubeadm 用于初始化集群,启动集群的命令工具
#• kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
(2)启动kubelet并设置开机自启
[root@k8smaster ~]# systemctl enable kubelet && systemctl start kubelet
(3)kubelet命令补全
[root@k8smaster ~]# echo "source <(kubectl completion bash)" >> ~/.bash_profile
[root@k8smaster ~]# source .bash_profile
(1)下载脚本
Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。
在当前位置自己建一个image.sh脚本
[root@k8smaster ~]# more image.sh
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.14.2
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
done
url为阿里云镜像仓库地址,version为安装的kubernetes版本。
(2)下载镜像
运行image.sh脚本,下载指定版本的镜像,运行前先赋予权限
(1)初始化
apiserver-advertise-address指定master的interface,pod-network-cidr指定Pod网络的范围,这里使用flannel网络方案。
[root@k8smaster ~]# kubeadm init --apiserver-advertise-address 192.168.56.200 --pod-network-cidr=10.244.0.0/16
此处红框标记的地方后面还会使用
(2)加载环境变量
如果为非root机
$ mkdir -p $HOME/.kube
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ chown $(id -u):$(id -g) $HOME/.kube/config
如果为root机
[root@k8smaster ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8smaster ~]# source .bash_profile
[root@k8smaster ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 在https://www.ipaddress.com/查询raw.githubusercontent.com的真实IP。
sudo vim /etc/hosts
199.232.28.133 raw.githubusercontent.com
与master节点操作相同
与master节点操作相同
首先在master机查看令牌是否过期
(1)查看令牌
[root@k8smaster ~]# kubeadm token list
发现token还没有过期,可以直接使用
如果token过期,TTL为invalid,则执行以下内容
①生成新的令牌
[root@k8smaster ~]# kubeadm token create
②生成新的加密串
[root@k8smaster ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
(2)node节点加入集群
在每个node节点上分别执行:
kubeadm join 192.168.56.200:6443 --token 9lniep.xkrxr75q2mmwnu1a \
--discovery-token-ca-cert-hash sha256:11a000513dc8af205141a24bfee671fcbe5812a379fb81bfce4384852c7961bc
若token和加密串有更新记得更换
(3)在master机查看节点
这里只加了node1
[root@k8smaster ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster Ready master 23h v1.14.2
k8snode1 NotReady <none> 29s v1.14.2
可以看到node节点已经加入,但status还是notready,只需要等待一会,可以使用
[root@k8smaster ~]# kubectl get pods -n kube-system
查看各组件状态,当组件都为running状态时(如图),需要稍微等几分钟
再次查看node节点状态
集群搭建已完成
dashboard是商业智能仪表盘(business intelligence dashboard,BI dashboard)的简称,它是一般商业智能都拥有的实现数据可视化的模块,是向企业展示度量信息和关键业务指标(KPI)现状的数据虚拟化工具。
下载yaml
[root@k8smaster ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml
修改文件,使用NodePort暴露到集群外,方便访问
[root@k8smaster ~]# vi recommended.yaml
[root@k8smaster ~]# kubectl create -f recommonded.yaml
[root@k8smaster ~]# kubectl get pod --all-namespaces
[root@k8smaster dashboard]# kubectl get pod,svc -n kubernetes-dashboard -o wide
可以在浏览器访问https://192.168.56.201:30000/
创建账户,获取token
#创建账户
[root@k8smaster ~]# kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
# 输出serviceaccount/dashboard-admin created
#授权
[root@k8smaster ~]# kubectl create clusterrolebinding dashboard-admin-rb --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
# 输出clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin-rb created
#获取账号token
[root@k8smaster ~]# kubectl get secrets -n kubernetes-dashboard |grep dashboard-admin
# 输出dashboard-admin-token-dj5j5 kubernetes.io/service-account-token 3 104s
[root@k8smaster ~]# kubectl describe secrets dashboard-admin-token-dj5j5 -n kubernetes-dashboard
# 输出如图
复制token到浏览器
使用管理员角色登录dashboard web界面
在浏览器手动输入https://192.168.56.201:30000
使用令牌登入
在kubernetes集群中创建一个pod,验证是否正常运行
[root@k8smaster dashboard]# kubectl create deployment nginx --image=nginx
[root@k8smaster dashboard]# kubectl expose deployment nginx --port=80 --type=NodePort
[root@k8smaster dashboard]# kubectl get pod,svc
结束。
参考:
(1)https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker
(2)https://blog.csdn.net/weixin_44806034/article/details/104996343
(3)https://www.cnblogs.com/byfboke/p/14149986.html
(4)https://blog.csdn.net/qq_45637155/article/details/111072182
(5)http://www.kendd.cn/?p=734
(6)https://blog.51cto.com/3241766/2405624
(7)https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/
(8)https://www.cnblogs.com/solomonxu/p/11484844.html