使用离线包部署kubernetes 1.9.0、kubernetes-dashboard 1.8

使用离线包部署kubernetes 1.9.0、kubernetes-dashboard 1.8,第1张

使用离线部署kubernetes 1.9.0、kubernetes-dashboard 1.8

===============================================

2018/3/22_第2次修改                       ccb_warlock

更新说明:

2018/3/22:修改了6.7中k8s-dashboard中url错误的问题;

===============================================

为了让产品在迎来业务量爆发式增长前完成应对措施,在浏览无数的资料后,决定将服务逐渐进行容器化,最终能达到容器集群的效果。


而容器集群的解决方案中,kubernetes(简称k8s)看起来是个可行的方案。


我目前的理解是,k8s就是docker容器集群的一个管理系统,有很多实用功能能提高开发、运维的效率。


尝试过使用在线部署的方式,当时记得即使配了代理有些资源仍然拉不下来,纠结了一天最后查找到了离线部署的教程(https://segmentfault.com/a/1190000012755243),这篇教程基本可以部署出可用的k8s。


本篇的部署内容和这个教程大体相同,我只是根据我部署的过程增补了一些描述和图片、修改了原教程中一些存在问题的内容。


节点配置信息表 节点 主机名 IP OS CPU核数   内存大小    Master     K8s-master        192.168.12.21        centos 7        4 4G Node1  K8s-node-1 192.168.12.22 centos 7 4 4G Node2  K8s-node-2 192.168.12.23 centos 7 4 4G

 

一、基础设置

 1.1 安装vim

yum install -y vim

 1.2 设置主机名

Master上执行:

hostnamectl --static set-hostname  k8s-master

Node1上执行:

hostnamectl --static set-hostname  k8s-node-1

Node2上执行:

hostnamectl --static set-hostname  k8s-node-2

# 重启

reboot

 1.3 分别修改三个节点的hosts文件,并使内容保持一致

# 编辑hosts文件

vim /etc/hosts

# 新增下面的内容,wq保存。


192.168.12.21 k8s-master
192.168.12.22 k8s-node-1
192.168.12.23 k8s-node-2

 1.4 关闭防火墙

这里为了部署方便,我跟原教程一样直接关了防火墙。


systemctl stop firewalld
systemctl disable firewalld

 1.5 关闭selinux

为了允许容器访问主机文件系统,这是pod网络所需的。


目前必须这样做,直到在kubelet中改进SELinux支持。


# 编辑config文件

vim /etc/selinux/config

将SELINUX=enforcing改为SELINUX=disabled,wq保存。


# 当前临时关闭selinux(不重启临时关闭selinux的方式)

setenforce 0

 1.6 关闭swap

试验下来k8s需要关闭虚拟内存。


# 当前临时关闭虚拟内存

swapoff -a

# 修改/etc/fstab文件

vim /etc/fstab

# 加#注释掉下面的语句屏蔽SWAP的自动挂载,wq保存

#/dev/mapper/centos-swap swapswapdefaults0 0

# 查看内存使用情况

free -m

 1.7 配置路由参数,防止kubeadm报路由警告

CentOS 7上的某些用户报告了由于iptables被绕过而导致流量被错误路由的问题。


你应该确保net.bridge.bridge-nf-call-iptables在你的sysctl配置中设置为1。


试验下来即使是firewalld的也要修改配置。


# 将内容写入k8s.conf文件

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 立即生效

sysctl --system

 1.8 获取离线包

离线包链接:https://pan.baidu.com/s/1eTWTXSI

密码:6uma

(教程里作者提供的文件中有个文件名和其教程的命令不一致,我修改该文件名后重新打包)

将k8s_images.tar.bz2上传到/root下。


# 安装 bzip2

yum install -y bzip2

# 解压k8s_images.tar.bz2

tar -xjvf k8s_images.tar.bz2

 

二、部署docker

选择安装docker1.2,因为官方建议的版本。


1.11、1.13和17.03版本也可以。


17.06+版本可能有效,但未经过Kubernetes团队的测试。


 2.1 安装

yum install -y docker

 2.2 启动

systemctl start docker
systemctl enable docker

 2.3 查看版本

docker version

 2.4 设置镜像加速

墙的缘故,访问docker hub不够稳定,故需要设置镜像加速来解决这个问题。



这里我使用的是阿里云的镜像加速。


登录阿里云后,访问https://cr.console.aliyun.com/#/accelerator

ps:registry-mirrors的值必须带https:// (有段时间阿里云的教程中只有域名),否则会出现docker重启报错的情况。


 2.5 查看docker文件驱动

docker info

这里我们主要是看cgroup driver。


因为K8S要求cgroup driver与docker的保持一致。


yum方式部署的应该是1.12.6,其Cgroup Driver为systemd。



 

三、分别在三个节点上部署kubeadm、kubelet、kubectl

 3.1 导入镜像 

docker load </root/k8s_images/docker_images/etcd-amd64_v3.1.10.tar
docker load </root/k8s_images/docker_images/flannel_v0.9.1-amd64.tar
docker load </root/k8s_images/docker_images/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-kube-dns-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-sidecar-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/kube-apiserver-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-controller-manager-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-scheduler-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-proxy-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/pause-amd64_3.0.tar
docker load </root/k8s_images/kubernetes-dashboard_v1.8.1.tar

 3.2 安装

cd /root/k8s_images
rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
rpm -ivh kubernetes-cni-0.6.0-0.x86_64.rpm kubelet-1.9.9-9.x86_64.rpm
rpm -ivh kubectl-1.9.0-0.x86_64.rpm
rpm -ivh kubeadm-1.9.0-0.x86_64.rpm

 3.3 修改kubelet的配置文件

kubelet默认的cgroup-driver和docker的不一样,docker有的版本可能是cgroupfs,kubelet默认为systemd,如果不修改则会引起kubelet启动失败。


vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# 重新载入

systemctl daemon-reload

 3.4 启动

systemctl enable kubelet && systemctl start kubelet

ps:此时用systemctl status查看会发现服务没有完全起来,这是因为还缺少许多文件在K8S初始化补齐后才能完全运行,所以我们继续部署。



 

四、部署master节点

 4.1 初始化k8s

kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

等待1分钟后,出现下面的内容。


如果长时间(等待的时间超过3分钟以上)始终停留在“[init] This might take a minute or longer if the control plane images have to be pulled.”,就要查看/var/log/message里的内容,是什么错误导致初始化失败。



排除错误后,先重置,再初始化。


# 初始化过程出现错误时,使用下面的命令重置
kubeadm reset
# 重置后再初始化
kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

上图中的token信息要记得保留,等会node的加入需要使用。


如果忘记了,可以在master上通过kubeadm token list得到。


默认token在24小时后过期,后续的node要加入集群需要在master节点上用下面的命令重新生成token。


kubeadm token create

 4.2 配置环境变量

此时root用户还不能使用kubelet控制集群,还需要配置该环境变量。


# 将信息写入bash_profile文件

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

# 立即生效

source ~/.bash_profile

 4.3 查看版本

kubectl version

 4.4 安装flannel

离线包有yml文件,所以直接用。


# 创建flannel

kubectl create -f kube-flannel.yml


 

五、部署node节点

# 使用4.1保存的“kubeadm join”的命令,分别将各个node节点加入master(token信息请根据你实际部署的修改掉,这里只是我部署时生成的内容)

kubeadm join --token 1ff84c.b7828d504656ba64 192.168.12.21:6443 --discovery-token-ca-cert-hash sha256:ceb2b93ce7543174b8fa87628fbe1f3926b5206915fee06629195ea8b4b89fe7 

根据提示,到master节点上检查下,在master上运行下面的命令。


kubectl get nodes

# kubernetes会在每个node节点创建flannel和kube-proxy的pod


 

六、部署kubernetes-dashboard

虽然经过几天的学习常用的k8s命令已经能熟练使用了,但是有个页面能够显示信息总比自己一个个命令查询效率来的高,还好原教程的作者也将该页面的yaml文件保存在离线包里了。


由于k8s的工作负载都放在node节点上,所以等node部署完后才进行页面的部署。


 6.1 修改配置文件

# 编辑kubernetes-dashboard.yaml

cd /root/k8s_images
vim kubernetes-dashboard.yaml

# 添加type: NodePort,暴露Dashboard服务。


注意这里只添加行type: NodePort即可,其他配置不用改。


(我这里需要补个截图)

 6.2 创建

kubectl create -f kubernetes-dashboard.yaml

 6.3 设置端口

由于系统默认的有效端口为30000-32767,故需要修改kube-apiserver.yaml设置我们需要的端口范围。


# 修改kube-apiserver.yaml

vim /etc/kubernetes/manifests/kube-apiserver.yaml

# 添加下面的内容,wq保存。


    - --service-node-port-range=1-65535

ps:-与--之间的不是空格

 6.4 设置验证方式

默认验证方式有kubeconfig和token,这里都不用,我们使用basicauth的方式进行apiserver的验证。


# 创建/etc/kubernetes/pki/basic_auth_file, 用于存放用户名、密码、用户ID。


cat <<EOF >  /etc/kubernetes/pki/basic_auth_file
admin,admin,2
EOF

# 编辑kube-apiserver.yaml,给kube-apiserver添加basic_auth验证

cd /etc/kubernetes/manifests
vim kube-apiserver.yaml

# 添加下面的内容,wq保存。


    - --basic_auth_file=/etc/kubernetes/pki/basic_auth_file

ps:-与--之间的不是空格

 6.5 更新apiserver

改完kube-apiserver.yaml后如果直接更新kube-apiserver容器,有时会报“The connection to the server 192.168.12.21:6443 was refused - did you specify the right host or port?”,试验后发现在更新之前还需要重启kubelet。


# 重启kubelet

systemctl restart kubelet

# 更新kube-apiserver容器

cd /etc/kubernetes/manifests
kubectl apply -f kube-apiserver.yaml

 6.6 授权

k8s 1.6以后的版本都采用RBAC授权模型。


# 查看cluster-admin

kubectl get clusterrole/cluster-admin -o yaml

# 给admin授权。


默认cluster-admin是拥有全部权限的,将admin和cluster-admin bind这样admin就有cluster-admin的权限。


kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin

# 查看

kubectl get clusterrolebinding/login-on-dashboard-with-cluster-admin -o yaml

 6.7 登录

由于https证书的问题,暂时只能先通过火狐浏览器增加安全例外的方式访问https://192.168.12.21:32666(端口是6.1中kubernetes-dashboard.yaml文件原作者配置的32666,如果需要修改请在6.1中进行修改后再创建)

6.4中,我配置的用户名/密码为admin/admin,故使用该用户名密码登录。



 参考资料:

1.https://segmentfault.com/a/1190000012755243

2.《kubernetes权威指南》

3.https://kubernetes.io/docs/setup/independent/install-kubeadm/

4.https://www.cnblogs.com/liuxuzzz/p/5324749.html

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/589455.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存