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

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

使用离线包部署kubernetes 1.9.0、kubernetes-dashboard 1.8的更多相关文章

  1. 二进制方式部署Kubernetes 1.6.0集群(开启TLS)

    本节内容: Kubernetes简介 环境信息 创建TLS加密通信的证书和密钥 下载和配置 kubectl(kubecontrol) 命令行工具 创建 kubeconfig 文件 创建高可用 etcd ...

  2. 关于Kubernetes v1.14.0的 kube-controller-manager部署

    1. kube-controller-manager准备 默认kube-controller-manager 部署在kube-apiserver部署的服务器上面服务器的配置等在这就不在列出来 二进制文 ...

  3. 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...

  4. Kubernetes 1.10.0离线安装

    讲述如何通过离线的方式安装Kubernetes,主要用于对Kubernetes的研究学习,不建议在生产环境使用,安装包获取地址: 链接:https://pan.baidu.com/s/1nX5_mem ...

  5. 使用 kubeadm 安装 kubernetes v1.16.0

    近日通过kubeadm 安装 kubernetes v1.16.0,踩过不少坑,现记录下安装过程. 安装环境: 系           统:CentOS Linux release 7.6 Docke ...

  6. 002.使用kubeadm安装kubernetes 1.17.0

    一 环境准备 1.1 环境说明 master      192.168.132.131      docker-server1 node1       192.168.132.132      doc ...

  7. 部署一套完整的Kubernetes高可用集群(二进制,v1.18版)

    一.前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm ...

  8. 基于Kubernetes v1.24.0的集群搭建(二)

    上一篇文章主要是介绍了,每台虚拟机的环境配置.接下来我们开始有关K8S的相关部署. 另外补充一下上一篇文章中的K8S的change​log链接: https://github.com/kubernet ...

  9. Windows Server 2008 R2 IIS7.5 部署 MVC HTTP 404.0 Not Found 错误

    如图 在Windows Server 2008 R2 IIS7.5 部署 MVC HTTP 404.0 Not Found 错误,在Win7环境下测试正常,在百度中查找相关解决方法,如修改配置文件等, ...

  10. 编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行

    今天主要来说说怎么在Hadoop2.2.0分布式上面运行写好的 Mapreduce 程序. 可以在eclipse写好程序,export或用fatjar打包成jar文件. 先给出这个程序所依赖的Mave ...

随机推荐

  1. [AT697]フィボナッチ

    题目大意:给你$n,k(n\leqslant10^9,k\leqslant10^3)$,求$f_n$.$f$数组满足$f_1=f_2=\cdots=f_k=1$,$f_n=\sum\limits_{i ...

  2. 如何将现有 git 仓库中的子项目单独抽出来作为一个独立仓库并保留其提交历史

    很多时候,我们会遇到在一个git仓库下包含了很多小项目,但是随着有些项目的需求逐渐增大或则市场需求,我们需要将其抽离出来,作为一个单独的项目进行维护并开发. 但是,如果直接拷贝文件粘贴到新建的git ...

  3. 图像处理之FPN校正

    1 FPN噪声介绍 FPN噪声(Fixed Pattern Noise)简称固定模式噪声,根据FPN噪声形成机制,分为行FPN和列FPN.行FPN: 在基于模拟域累加实现的TDI-CMOS图像传感器中 ...

  4. mysql 5.7 json 字段类型查找、修改

    修改 json 里的数组字段 mysql> set @json = '{"test": [{"name": "laravel"}, { ...

  5. hdu 6311 欧拉回路

    题意:求一个图(不一定联通)最小额外连接几条边,使得可以一笔画出来 大致做法 1.找出联通块 2.统计每一个连通块里面度数为奇数的点的个数, 有一个性质 一个图能够用一笔画出来,奇数点的个数不超过2个 ...

  6. 前缀、中缀、后缀表达式以及简单计算器的C++实现

    前缀表达式(波兰表达式).中缀表达式.后缀表达式(逆波兰表达式) 介绍 三种表达式都是四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解. 前缀表达式 前缀表达式是一种没有括号的算术表达式 ...

  7. centos7 U盘安装卡在 starting dracut initqueue hook解决办法

    U盘安装centos7启动过程中出现: [ok] Reached target Basic System 或者 [ok] starting dracut initqueue hook   到下一行就不 ...

  8. Django中@login_required用法简介

    我们在网站开发过程中,经常会遇到这样的需求: 用户登陆系统才可以访问某些页面 如果用户没有登陆而直接访问就会跳转到登陆界面,而不能访问其他页面. 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访 ...

  9. OpenStack 认证服务 KeyStone连接和用户管理(四)

    连接keystone两种方式: 一种使用命令 一种使用环境变量 1.通过环境变量方式连接keystone(适合在初始化场景使用) 配置认证令牌环境变量 export OS_TOKEN=07081849 ...

  10. tf.nn.conv2d 参数介绍

    tf.nn.conv2d是TensorFlow里面实现卷积的函数,参考文档对它的介绍并不是很详细,实际上这是搭建卷积神经网络比较核心的一个方法,非常重要 tf.nn.conv2d(input, fil ...