docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面

docker+k8s本地搭建

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

1 虚拟机联网

配置静态ip(自己设置ip)
参考:https://blog.csdn.net/weixin_44806034/article/details/104996343

2 系统初始化

2.1 设置主机名

所有虚拟机分别执行相应命令

[root@localhost ~]# hostname set-hostname k8smaster
[root@localhost ~]# hostname set-hostname k8snode1
[root@localhost ~]# hostname set-hostname k8snode2

2.2 关闭防火墙

所有机器都要执行

$ systemctl stop firewalld    #临时关闭
$ systemctl disable firewalld #永久关闭

2.3 关闭selinux

避免集群搭建出问题,所有机器都要执行

$ sed -i 's/enforcing/disabled/' /etc/selinux/config    #永久
$ setenforce 0       #临时

2.4 关闭swap分区

$ swapoff -a    #临时
$ sed -i.bak '/swap/s/^/#/' /etc/fstab  #永久

2.5 在master添加hosts(解析主机名)

这一步仅在master机执行

$ cat >> /etc/hosts << EOF
192.168.56.200 master
192.168.56.201 node1
192.168.56.202 node2
EOF

2.6 将桥接的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  # 使前面的操作生效,执行后输出如下

以下为输出
docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第1张图片

2.7 时间同步

所有机器执行

$ yum install ntpdate -y
$ ntpdate time.windows.com

3 安装docker

所有节点都需要安装docker

3.1 安装依赖包

$ yum install -y yum-utils device-mapper-persistent-data lvm2

3.2 安装docker

没有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+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第2张图片

3.3 镜像加速

由于Docker Hub的服务器在国外,下载镜像会比较慢,可以配置镜像加速器。主要的加速器有:Docker官方提供的中国registry mirror、阿里云加速器、DaoCloud 加速器,在此使用阿里云配置。
(1)登录阿里云模块
登录地址:https://cr.console.aliyun.com/cn-beijing/instances/mirrors
docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第3张图片

(2)配置并重启

$ cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://y4wniq8i.mirror.aliyuncs.com"]
}
EOF
$ systemctl daemon-reload
$ systemctl restart docker  #重启docker

截图
docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第4张图片
(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

3.4 检验docker

通过以上操作docker已经安装好了,现在进行检验

$ docker –version    # 查看docker版本
$ docker run hello-world

docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第5张图片
出现图示结果,说明docker安装成功。

4 安装k8s

4.1 验证mac地址uuid

保证各节点mac和uuid唯一
所有机器斗眼执行

$ cat cat /sys/class/net/ens32/address
$ cat /sys/class/dmi/id/product_uuid

4.2 禁用swap分区、内核参数修改

略,在准备阶段已经操作了

4.3 修改Cgroup Drive

这一步可以先不用管,跳过该步,但是可以了解一下docker和k8s的Cgroup驱动,如果后面某步有Cgroup相关报错可回来揣摩一下。
点击了解Cgroup驱动
(1)修改 daemon.json

修改daemon.json,新增‘ “exec-opts”: [“native.cgroupdriver=systemd”] ’

在这里插入图片描述
(2)重新加载docker

$ 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/
但是可能会报错,如果报错删掉增加的信息,不影响后面操作。

4.4 更新缓存

$ yum clean all
$ yum -y makecache

5 Master节点安装

5.1 版本查看

[root@k8smaster ~]# yum list kubelet --showduplicates | sort -r

docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第6张图片
版本1.14.2支持docker版本18.09,下载该版本

5.2 安装kubelet、kubeadm、kubectl

(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

5.3下载镜像

(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脚本,下载指定版本的镜像,运行前先赋予权限
docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第7张图片

5.4 初始化Master

(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

docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第8张图片
此处红框标记的地方后面还会使用
(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

5.5 安装pod网络

[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

6 Node节点安装

6.1 安装kubelet、kubeadm、kubectl

与master节点操作相同

6.2 下载镜像

与master节点操作相同

6.3 加入集群

首先在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和加密串有更新记得更换
docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第9张图片
(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状态时(如图),需要稍微等几分钟
docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第10张图片
再次查看node节点状态
在这里插入图片描述
集群搭建已完成

7 Dashboard安装

dashboard是商业智能仪表盘(business intelligence dashboard,BI dashboard)的简称,它是一般商业智能都拥有的实现数据可视化的模块,是向企业展示度量信息和关键业务指标(KPI)现状的数据虚拟化工具。

7.1 安装dashboard

下载yaml

[root@k8smaster ~]# wget  https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml

修改文件,使用NodePort暴露到集群外,方便访问

[root@k8smaster ~]# vi recommended.yaml

docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第11张图片
修改好后执行一下命令来创建pod:

[root@k8smaster ~]# kubectl create -f recommonded.yaml

docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第12张图片
查看pod状态

[root@k8smaster ~]# kubectl get pod --all-namespaces

docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第13张图片
查看运行节点和端口

[root@k8smaster dashboard]# kubectl get pod,svc -n kubernetes-dashboard -o wide

docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第14张图片
可以在浏览器访问https://192.168.56.201:30000/
docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第15张图片
创建账户,获取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
# 输出如图

docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第16张图片
复制token到浏览器
使用管理员角色登录dashboard web界面
在浏览器手动输入https://192.168.56.201:30000
使用令牌登入
docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第17张图片

8 测试kubernetes集群

在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

docker+k8s本地搭建集群,并用Dashboard实现集群的图像界面_第18张图片
结束。
参考:
(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

你可能感兴趣的:(linux,docker,kubernetes)