全栈工程师开发手册 (作者:栾鹏)
架构系列文章


每个主机切换到同一具有sudo权限的用户,加入用户为k8s_user,
k8s各节点SSH免密登录。
各节点时间同步。
各节点主机名和IP加入/etc/hosts解析
各Node必须关闭swap:swapoff -a,否则kubelet启动失败。

设置每个节点的主机信息

1、master上执行:

a) 设置主机名称命令:hostnamectl --static set-hostname k8s-master
b) 关闭防火墙命令:

   systemctl disable firewalld.servicesystemctl stop firewalld.service

c) 设置hosts命令:

echo '192.168.72.183    k8s-master
192.168.72.183   etcd
192.168.72.183   registry
192.168.72.184   k8s-node-1' >> /etc/hosts

2、 node上执行:

a) 设置主机名称命令:hostnamectl --static set-hostname k8s-node-1
b) 关闭防火墙命令:

systemctl disable firewalld.service
systemctl stop firewalld.service

c) 设置hosts命令:

echo '192.168.72.183    k8s-master
192.168.72.183   etcd
192.168.72.183   registry
192.168.72.184   k8s-node-1' >> /etc/hosts

1、设置主机之间ssh无密码登录。

本地系统执行 ssh-keygen -t rsa 命令,生成密钥文件

本地机器执行命令如:ssh-copy-id -i ~/.ssh/id_rsa.pub k8s-node-1ssh-copy-id -i ~/.ssh/id_rsa.pub k8s-master 将公钥文件传输的远程机器,并生效。

注意:

  • 免密码登录的处理是用户对用户的,切换其他用户后,仍然需要输入密码
  • 公钥传到远程机器并生效的操作,可用其他方式实现,如scp后修改authorized_keys
  • 远程机器的.ssh目录需要700权限,authorized_keys文件需要600权限

2、每个主机节点安装docker

下面的命令安装docker,多运行几次,有时网络不好会出错。(k8s目前支持docker17.03),所以最好不要安装docker18.03

sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce安装最新版的
apt-get install docker.io安装指定版本
apt-cache madison docker-ce            查看支持的安装版本
sudo apt-get install docker-ce=17.03.3~ce-0~ubuntu-xenial

卸载docker

sudo apt-get autoremove --purge docker-engine
sudo apt-get autoremove --purge docker-ce

卸载Docker后,/var/lib/docker/目录下会保留原Docker的镜像,网络,存储卷等文件. 如果需要全新安装Docker,需要删除/var/lib/docker/目录

sudo rm -rf /var/lib/docker

CentOS7安装

在CentOS7+上可以通过yum直接安装(这个版本是1.12.6)。

yum -y install docker

启用中国加速器

echo '{"registry-mirrors": ["http://bcfb7352.m.daocloud.io"]}' > /etc/docker/daemon.json

如果之前装有其他版本的,需要删除所有镜像和容器,并卸载docker重装

另一种配置中国加速器的方法,编辑配置文件

sudo vim /etc/docker/daemon.json{
"registry-mirrors": ["https://registry.hub.docker.com",              # 如果设置registry-mirrors就必须要把官方镜像加上才能拉取在docker hub上自己创建的仓库"https://2lqq34jg.mirror.aliyuncs.com","https://pee6w651.mirror.aliyuncs.com","https://registry.docker-cn.com","http://hub-mirror.c.163.com"
]
}
重启docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo service docker restart

使用ansible部署k8s集群

git地址:https://github.com/626626cdllp/k8s/tree/master/kube-ansible

使用rancher部署k8s集群

将hostname改成小写,这样能顺利安装rke(rancher kubernetes enginer)

修改/etc/hostname
修改/etc/hosts

不然部署会报错
Can not find RKE state file: open /var/lib/rancher/management-state/rke/rke-699207778/cluster.rkestate: no such file or directory

如果之前安装过docker和k8s,需要运行

#删除所有容器
sudo docker rm -f $(sudo docker ps -qa)#删除/var/etcd目录
sudo rm -rf /var/etcd#删除/var/lib/kubelet/目录,删除前先卸载
for m in $(sudo tac /proc/mounts | sudo awk '{print $2}'|sudo grep /var/lib/kubelet);dosudo umount $m||true
done
sudo rm -rf /var/lib/kubelet/#删除/var/lib/rancher/目录,删除前先卸载
for m in $(sudo tac /proc/mounts | sudo awk '{print $2}'|sudo grep /var/lib/rancher);dosudo umount $m||true
done
sudo rm -rf /var/lib/rancher/#删除/run/kubernetes/ 目录
sudo rm -rf /run/kubernetes/#删除所有的数据卷
sudo docker volume rm $(sudo docker volume ls -q)#再次显示所有的容器和数据卷,确保没有残留
sudo docker ps -a
sudo docker volume ls

有时需要重启才能清理干净。

一定要把旧数据清理干净,etcd,rancher之类的,不然安装不上。

先部署rancher

启动

sudo docker run -d --restart=unless-stopped --name=rancher-server -p 8080:8080 rancher/server:stable

也可以安装最新版的

sudo docker run -d --restart=unless-stopped -p 8001:80 -p 8002:443 -v /root/var/log/auditlog:/var/log/auditlog -e AUDIT_LEVEL=3 rancher/rancher:latest

这里先说一下注意事项:

①rancher分为master和agent。二者最好分开部署,不要让一个节点既是master又是agent

②节点的资源要求:内存要不小于4G,推荐8G以上。4G以下,运行时服务经常会停止。

③所有节点都要配置时间同步

④提前将镜像下载到节点并加载,可以大幅度提升安装速度。(也可以搭建docker镜像私库)

⑤启用Docker的中国加速器,否则部署会很慢

参照 https://www.docker-cn.com/registry-mirror 或者 https://www.daocloud.io

等待容器启动访问对应IP的8080端口的地址,在页面右下脚,切换语言为中文简体。

先进入到环境管理添加环境模板选择K8S,然后点击编辑环境

修改以下可配置项,更换K8S私有仓库地址

Private Registry for Add-Ons and Pod Infra Container Image的值为

registry.cn-shenzhen.aliyuncs.com

但是由于有些镜像更换镜像地址以后可能就找不到了,所以建议还是不要添加这个私有仓库地址。慢一点安装。

点击底部的设置,然后添加模板名称k8s-CN,在页面最下面点击创建后就能看到有这样一个模板了 。

再部署k8s

同样在环境配置中选择添加环境 ,填写好名称K8S-DEMO,选择我们之前创建好的国内K8S模板k8s-CN。

创建好之后在左上角选择我们创建的环境K8S-DEMO,可以看到初始化进度,等待添加主机。

选择技术架构->主机,添加主机 ,设置主机连接到Rancher的地址(在内网情况下使用内网IP) ,由于我这里是内网,所以直接使用的http://192.168.12.96:8080,也就是部署rancher-server的web地址,点击保存后,选择custom

在步骤4中,填入部署k8s的主机的ip,然后复制部署脚本,在该ip的主机上的运行部署命令。

点击下面的关闭按钮,新的主机注册后会显示在 主机 页面。

再依次添加其他主机。

等待主机上的应用全部部署完成。(缓存的等待安装,圆环的为安装完成,黄色三角形状为安装失败(主要是网络原因),安装失败rancher会重新下载安装,只要等待就行)


部署完成后 KUBERNETES——> 仪表盘,可以进入k8s的dashboard, 在KUBERNETES——> CLI执行kubectl命令行操作。

注意: 新版本部署已定要等kubernetes 版本选项出来才能部署(有时网络可能会比较慢)

问题:我在部署时遇到kubelet worker docker不停重启失败问题。

Error (Error response from daemon: invalid mount config: must use either propagation mode "rslave" or "rshared" when mount source is within the daemon root, daemon root: "/var/lib/docker", bind mount source: "/var/lib/docker", propagation: "rprivate")

是因为我这边安装的是docker18,挂在形式变了,所以需要做一些改动

mount --make-shared /或配置docker.service设置
[Service]
MountFlags=shared重启docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo service docker restart

用户级配置文件:

/etc/docker/daemon.json(没有则自己创建)

系统级配置文件:

/lib/systemd/system/docker.service —> 启动服务脚本:systemctl start docker 命令就是调用此配置文件

配置参考
https://github.com/moby/moby/blob/master/contrib/init/systemd/docker.service

上面的教程可能不会成功, 那就还是换回docker17.03吧

每个节点上安装kubectl

wget https://dl.k8s.io/v1.11.6/kubernetes-client-linux-amd64.tar.gz
tar -zxvf kubernetes-client-linux-amd64.tar.gz
cd kubernetes/client/bin
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

linux命令行通过tab键自动补全的方式

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

修改rancher安装的应用的镜像地址。

kubectl edit deployments monitoring-influxdb -n kube-system
将image地址由
registry.cn-shenzhen.aliyuncs.com /rancher/heapster-influxdb-amd64:v1.3.3
改成
rancher/heapster-influxdb-amd64:v1.3.3

注意每个deployment中不止有一个image设置点

使用自定义脚本部署k8s集群

注意:目前Kubernetes为Ubuntu提供的kube-up脚本,不支持15.10以及16.04这两个使用systemd作为init系统的版本。

使用自动化脚本,脚本下载地址:https://github.com/626626cdllp/k8s/tree/master/kubernetes

源码下载好后,需要修改配置文件:

root# cd kubernetes/cluster/ubuntu
root# vim config-default.sh

要修改三个地方:

  1. export nodes=${nodes:-"root@10.203.2.239 root@10.203.2.233 root@10.203.2.243"} 这里是三个节点,有几个就配几个
  2. role=${role:-"ai i i"}这里的值与上面的对应,ai表示既是master又是minion,i表示minion节点。
  3. export NUM_NODES=${NUM_NODES:-3}这里的数字对应节点的个数

然后默认下载的二进制执行文件的版本比较老,我们修改以下,使用比较新的版本:
还是在kubernetes/cluster/ubuntu文件夹下,打开download-release.sh文件,修改如下几行:

FLANNEL_VERSION=${FLANNEL_VERSION:-"0.5.5"}
ETCD_VERSION=${ETCD_VERSION:-"2.2.1"}
KUBE_VERSION=${KUBE_VERSION:-"1.1.7"}

保存上面两个文件。

下面就开始部署了,kubernetes的部署挺傻瓜的,首先进入kubernetes/cluster文件夹下,执行如下命令:

root# KUBERNETES_PROVIDER=ubuntu ./kube-up.sh

其中KUBERNETES_PROVIDER指明了在Ubuntu上部署集群。

运行此命令后,kubernetes首先根据指定的版本下载flanneld,etcd,kubernetes的可执行文件,由于国内网速较慢,可能需要一些时间,此后的工作会自动完成。

执行成功后,另外打开一个控制台,使用kubectl get nodes测试是否搭建成功:

chy@chy-station:~$ kubectl get nodes
NAME           LABELS                                STATUS    AGE
10.203.2.233   kubernetes.io/hostname=10.203.2.233   Ready     1h
10.203.2.239   kubernetes.io/hostname=10.203.2.239   Ready     1h
10.203.2.243   kubernetes.io/hostname=10.203.2.243   Ready     1h

以上信息表示集群搭建成功。

关闭集群是在kubernetes/cluster文件夹下执行

root# KUBERNETES_PROVIDER=ubuntu ./kube-down.sh

使用kubeadm部署k8s集群

参考:http://blog.51cto.com/newfly/2288088

不过要求的电脑能够翻墙。

以root用户ssh到每台机器上,运行:

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' >/etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y  kubeadm
apt-get install -y kubelet kubeadm kubectl kubernetes-cni
#它会自动安装kubeadm、kubectl、kubelet、kubernetes-cni、socat

其中下面命令需要翻墙

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

可以分解为下面两步
1、curl -O https://packages.cloud.google.com/apt/doc/apt-key.gpg #该命令执行后会在当前目录下保存一个名称为nodesource.gpg.key的文件。
2、使用apt-key命令加载获取到的文件 apt-key add nodesource.gpg.key

后续参考:
https://www.jianshu.com/p/602c5bdbbd4d

http://windgreen.me/2018/02/23/%E5%9B%BD%E5%86%85%E4%BD%BF%E7%94%A8kubernetes%E8%B8%A9%E8%BF%87%E7%9A%84%E5%9D%91/

http://blog.51cto.com/newfly/2288088

手动安装部署k8s集群

下载etcd

在部署机上下载etcd

ETCD_VERSION=${ETCD_VERSION:-"3.3.9"}
ETCD="etcd-v${ETCD_VERSION}-linux-amd64"
curl -L https://github.com/coreos/etcd/releases/download/v${ETCD_VERSION}/${ETCD}.tar.gz -o etcd.tar.gztar xzf etcd.tar.gz -C /tmp
cd /tmp/etcd-v${ETCD_VERSION}-linux-amd64for h in master node1 node2 node3 node4; do ssh user@$h mkdir -p '$HOME/kube' && scp -r etcd* user@$h:~/kube; done
for h in master node1 node2 node3 node4; do ssh user@$h 'sudo mkdir -p /opt/bin && sudo mv $HOME/kube/* /opt/bin && rm -rf $home/kube/*'; done

上面的代码要实现的目的就是到github上下载压缩包,然后scp到各个主机节点。所以你可以手动执行上面的操作。

手动到github上下载etcd release (https://github.com/etcd-io/etcd/releases) 的.tar.gz包,解压。通过scp复制 etcd 和etcdctl到各个主机(每台主机需要配置ssh)。然后复制到/opt/bin目录下。

root@localhost:/opt/bin# ls
Documentation  etcd  etcdctl  README-etcdctl.md  README.md  READMEv2-etcdctl.md

配置etcd服务

在每台主机上,分别创建/opt/config/etcd.conf和/lib/systemd/system/etcd.service文件,(注意修改IP地址,和主机名)

/opt/config/etcd.conf

sudo mkdir -p /var/lib/etcd/
sudo mkdir -p /opt/config/
sudo  cat <<EOF |  sudo tee /opt/config/etcd.conf
ETCD_DATA_DIR=/var/lib/etcd
ETCD_NAME=etcd5
ETCD_INITIAL_CLUSTER=etcd5=http://10.107.20.5:2380,etcd6=http://10.107.20.6:2380,etcd7=http://10.107.20.7:2380,etcd8=http://10.107.20.8:2380,etcd9=http://10.107.20.9:2380
ETCD_INITIAL_CLUSTER_STATE=new
ETCD_LISTEN_PEER_URLS=http://10.107.20.5:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=http://10.107.20.5:2380
ETCD_ADVERTISE_CLIENT_URLS=http://10.107.20.5:2379
ETCD_LISTEN_CLIENT_URLS=http://10.107.20.5:2379,http://127.0.0.1:2379
GOMAXPROCS=$(nproc)
EOF

此处五台主机的ETCD_NAME为etcd 5-9,可修改ETCD_NAME为自己起得名字(相应的ETCD_INITIAL_CLUSTER中对应五个名字)。每台主机上修改ETCD_LISTEN_PEER_URLS、ETCD_INITIAL_ADVERTISE_PEER_URLS、ETCD_ADVERTISE_CLIENT_URLS、ETCD_LISTEN_CLIENT_URLS为本机的ip。

/lib/systemd/system/etcd.service

[Unit]
Description=Etcd Server
Documentation=https://github.com/coreos/etcd
After=network.target[Service]
User=root
Type=simple
EnvironmentFile=-/opt/config/etcd.conf
ExecStart=/opt/bin/etcd
Restart=on-failure
RestartSec=10s
LimitNOFILE=40000[Install]
WantedBy=multi-user.target

然后在每台主机上运行如下命令,将etcd加入开机服务并启动

sudo systemctl daemon-reload
sudo systemctl enable etcd
sudo systemctl start etcd

部署K8s Master

下载Flannel

FLANNEL_VERSION=${FLANNEL_VERSION:-"v0.7.0"}
curl -L https://github.com/coreos/flannel/releases/download/v${FLANNEL_VERSION}/flannel-${FLANNEL_VERSION}-linux-amd64.tar.gz flannel.tar.gz
tar xzf  flannel.tar.gz -C /tmp

如etcd一般,可手动到github上下载,解压到/tmp。 https://github.com/coreos/flannel/releases

ubuntu搭建Kubernetes集群(ansible,kubedam,rancher)相关推荐

  1. 使用VirtualBox【四步】搭建Kubernetes集群(2023-02-13)

    文章内容: 使用VirtualBox.Containerd.Kubeadm等在本地搭建一个用于测试的3节点Kubernetes集群. 搭建过程中踩过的坑以及解决方案说明. 搭建环境:MacOS Mon ...

  2. Centos7搭建Kubernetes集群

    @Author:By Runsen Kubernetes Kubernetes 及其整个生态系统(工具.模块.插件等)均使用 Go 语言编写,从而构成一套面向 API.可高速运行的程序集合,这些程序文 ...

  3. Kubernetes入门--搭建Kubernetes集群,并启动容器服务

    英文原作者:Ben Cane  翻译作者:Miazzy 翻译&转载:https://blog.codeship.com/getting-started-with-kubernetes/ Kub ...

  4. Kubeadm介绍与使用Kubeadm搭建kubernetes集群环境

    文章目录 1.Kubeadm介绍 2.使用Kubeamd搭建kubernetes集群环境 2.1.首先准备一个三台的centos机器 2.2.yum -y update [在三台机器上执行更新包] 2 ...

  5. k8s学习(2)- 虚拟机搭建搭建Kubernetes集群(1.24.2)

    虚拟机搭建搭建Kubernetes集群 环境 规划 虚拟机搭建 配置网络 解决和主机复制粘贴的问题 使用MobaXterm连接虚拟机 安装vmware tools(建议使用MobaXterm) 配置y ...

  6. ubuntu 搭建k8s集群中篇

    文章目录 概述 一.安装kubeadm 1 关闭防火墙和关闭swap 2 配置软件源 2.1 安装系统工具 2.2 安装 GPG 证书 2.3 写入软件源 3 安装 kubeadm,kubelet,k ...

  7. 从头开始搭建kubernetes集群+istio服务网格(3)—— 搭建istio

    (win10 + virtualbox6.0 + centos7.6.1810 + docker18.09.8 + kubernetes1.15.1 + istio1.2.3) 本文参考网址: htt ...

  8. 从0到1搭建kubernetes集群

    环境准备 笔者是在阿里云租了三台ecs服务器,系统选用的ubuntu16.04(2核4G,建议CPU核数不少于2, 配置过低preflight checks阶段可能会报错). 使用几个虚拟机也可,有条 ...

  9. 搭建kubernetes集群管理平台

    一. kubernetes和相关组件介绍 1. kubernetes概述 Kubernetes是google开源的容器集群管理系统,基于docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务 ...

最新文章

  1. 「无心插柳柳成荫」的乔姆斯基 | 追溯 AI 大师系列
  2. android 九宫格虚线,形状Drawable和九宫格
  3. js排序的时间复杂度_JavaScript插入排序算法通俗说明
  4. 安装python解释器
  5. HJ浇花(牛客竞赛 约束差分)
  6. 为什么机器学习算法要与人类水平比较
  7. resultmap拿不到数据_阿里巴巴国际站每日电商运营工作数据表格
  8. 机器学习-吴恩达-笔记-14-应用实例:图片文字识别
  9. AMESim软件建模
  10. c语言题库打不开软件,编写题库程序_想把一个老师编的做题练习的软件里面的题库弄出来貌似是用VB60编写的要怎么做啊_淘题吧...
  11. html大作业【NBA篮球介绍 22个页面】学生网页设计源码
  12. Alphabetic Removals详解(特殊算法巧解)
  13. 计算机 桌面上的文件怎么发送,文本文件如何发送到QQ邮箱里?
  14. 【mysql】算术运算符
  15. 如何从零搭建自动化测试框架
  16. 康卡斯特使持续升级,以有线电视
  17. 五年IT五股东风 吹奏一曲SaaS“东风破”
  18. 几个常用的FFmpeg小技巧
  19. 关于FusionChartsFree y轴不显示中文 的解决办法
  20. 一个非常轻巧的基于Groovy的Web应用程序项目模板

热门文章

  1. python处理excel表格-如何用python处理excel表格
  2. 讯飞输入法10周年:日语音交互次数超10亿
  3. linux向脚本传递参数,Linux 使用位置变量向脚本传递参数
  4. 在设备上添加项目失败_使用VisualGDB将Keil项目导入VisualStudio
  5. 【二分法】计蒜客:切割钢管
  6. x264源代码简单分析:熵编码(Entropy Encoding)部分
  7. cocos2d-x3.4 android重新编译,cocos2d-x 4.0 Spine 3.8编译环境配置(高级篇)
  8. jumpserver mysql跳板_jumpserver跳板机
  9. setwindowpos怎么改变z序_Windows转Mac——操作习惯的改变!
  10. npm工具运行Vue项目